首页 > 代码库 > PL/SQL 编程(二)

PL/SQL 编程(二)



1    For循环
    语法:begin
            for i in reverse 1..10 loop
            insert into users values(i,’奥巴马‘);
            end loop;
          end;
    注意:循环变量 i 是隐含增加的,所以无法看到
    
2    goto语句
    goto 语句用于跳转到特定的位置去执行语句。由于goto语句会减少程序的可读性,所以一般情况下
    不建议使用goto语句
    
3    null语句
    null语句不会执行任何操作,但是可以增加程序的可读性
    
4    创建返回值是一个结果集的存储过程
    (1) 创建一个包:
        SQL> create or replace package testpackage as
             type test test_cursor is ref cursor;
             end testpackage;
            
    (2) 创建存储过程
        SQL> create or replace procedure sp_procedure1
             (stuNo in number, param_cursor out testpackage.test_cursor) is
             begin
                open param_cursor for select * from emp where sutno=stuNo;
             end;
    
5    分页
    (1) sql语句
        select * from
        (select *,rownum NO from
        (select * from emp) where rownum <=20) where rownum >=10;
        
    (2)    创建一个包
        create or replace package testpackage2 as
             type test test_cursor is ref cursor;
             end testpackage2;
            
    (3)    创建存储过程
        SQL> create or replace procedure procedureName2
            (tableName in varchar2,                    -- 表名
            pageSize in number,                        -- 每页显示的记录数
            pageNow in number,                        -- 当前是第几页
            pageCount out number,                    -- 总页数
            p_cursor out testpackage2.test_cursor) is
            v_sql varchar2(1000);
            v_beginNum number := (pageNow -1)* pageSize + 1;
            v_endNum number := pageNow * pageSize;
            begin
                v_sql := ‘select * from (select *,rownum NO from (select * from ‘|| tableName ||‘)
                where rownum <= ‘|| v_endNum ||‘) where rownum >= ‘|| v_beginNum;
                open p_cursor for v_sql;
                -- 创建一个sql语句
                v_sql := ‘select count(*) from ‘ || tableName;
                -- 执行sql语句,将结果保存
                execute immediate v_sql into rows;
                if mod(rows,pageSize) = 0
                then pageCount := rows / pageSize;
                else
                pageCount := rows / pageSize + 1;
                end if;
                -- 关闭游标
                close p_cursor;
            end;
    
6    异常处理
    (1) 预定义异常
    (2) 非预定义异常
    (3) 自定义异常
    
    例1
    SQL> declare v_name emp.ename%type;
         begin
         select ename into v_name from emp where empno = &no;
         dbms_output.put_line(‘名字:‘ || v_name);
         exception
            when no_data_found
            then dbms_output.put_line(‘编号没有!‘);
         end;
        
    预定义异常
    a case_not_found
      在编写case 语句时,如果在when子句中没有包含必须的条件分支(没有符合条件的),就会触发case_not_found异常
    b cursor_already_open
      当重新打开已经打开的游标时触发此异常
    c dup_val_on_index
      在唯一索引所对应的列上插入重复值时触发此异常
    d invalid_cursor
      当试图在不合法的游标上进行操作时触发此异常    
    e invalid_number
      当输入的数字无效时触发此异常
    f too_many_rows
      当返回值不止是一条记录时触发此异常
    g zero_divide
      当进行 x/0,即除数为零的操作时触发此异常
    h value_error
      当进行赋值操作时,如果变量的长度不足以存储实际数据时触发此异常
    i login——denide
      当用户非法登录时会触发此异常
    j not_logged_on
      如果用户没有登录就执行DML操作,就会触发此异常
    k storage_error
      如果超出了内存空间,就会触发此异常
    l timeout_on_resource
      当Oracle等待资源时,如果发生超时情况,就会触发此异常

    自定义异常
    SQL> create or replace procedure procedureName2(sp_empNo number) is
         MyExpception Exceptiom;        -- 自定义一个异常
         begin
         update emp set sal = sal * 1.2 where empno = &no;
         if sql%notfound then
            raise MyExpception;            -- 触发自定义异常
         end if;
         exception
            when no_data_found
            then dbms_output.put_line(‘没有更新数据!‘);
         end;