Oracle存储过程、游标使用

转:http://blog.csdn.net/aqszhuaihuai/article/details/6241291

Oracle存储过程:

语法:
CREATE [OR REPLACE] PROCEDURE procedure_name
(arg1 [mode1] datatype1,arg2 [mode2] datatype2,...)
IS [AS]
PL/SQL BLOCK;
mode用于指定输入输出参数:IN为输入参数,OUT为输出参数,当为输入参数时可以省去IN,OUT不能省去。
如果没有输入输出参数,可以省去
(arg1 [mode1] datatype1,arg2 [mode2] datatype2,...)这一行

一个带有输入,输出参数的简单的例子

 

[java]  view plain copy
 
  1. CREATE OR REPLACE PROCEDURE proc_in_out_test(var_empno NUMBER,  
  2.                                              var_ename OUT VARCHAR2) IS  
  3. BEGIN  
  4.   SELECT ename INTO var_ename FROM emp WHERE empno = var_empno;  
  5. EXCEPTION  
  6.   WHEN no_data_found THEN  
  7.     raise_application_error(-20000'该员工不存在');  
  8. END;  

调用该过程

 

[c-sharp]  view plain copy
 
  1. SQL> var vempno number;  
  2. SQL> var vename varchar2(10);  
  3. SQL> exec :vempno:=7934;  
  4. SQL> exec proc_in_out_test(:vempno,:vename);  
  5. PL/SQL procedure successfully completed  
  6. vename  
  7. ---------  
  8. MILLER  
  9.   
  10. SQL> exec :vempno:=7935;  
  11. SQL> exec proc_in_out_test(:vempno,:vename);  
  12.   
  13. begin proc_in_out_test(:vempno,:vename); end;  
  14.   
  15. ORA-20000: 该员工不存在  
  16. ORA-06512: 在 "SCOTT.PROC_IN_OUT_TEST", line 7  
  17. ORA-06512: 在 line 1  

 

显示游标语法:

CURSOR cursor_name IS select_statement

一个简单的例子:

 

[java]  view plain copy
 
  1. DECLARE  
  2.   v_empname emp.ename%TYPE;  
  3.   v_job     emp.job%TYPE;  
  4.   v_deptno  emp.deptno%TYPE;  
  5.   CURSOR emp_test IS --声明游标  
  6.     SELECT ename, job FROM emp WHERE deptno = v_deptno;  
  7. BEGIN  
  8.   v_deptno := 10;  
  9.   OPEN emp_test; --打开游标  
  10.   --循环游标  
  11.   LOOP  
  12.     FETCH emp_test  
  13.       INTO v_empname, v_job; --取值  
  14.     EXIT WHEN emp_test%NOTFOUND; --当没有记录时退出循环  
  15.     dbms_output.put_line('empname=' || v_empname || ',job=' || v_job);  
  16.   END LOOP;  
  17.   CLOSE emp_test;  
  18. END;  
  19. --游标的属性有:%FOUND,%NOTFOUNRD,%ISOPEN,%ROWCOUNT;  
  20. --%FOUND:已检索到记录时,返回true  
  21. --%NOTFOUNRD:检索不到记录时,返回true  
  22. --%ISOPEN:游标已打开时返回true  
  23. --%ROWCOUNT:代表检索的记录数,从1开始  

 参数化游标只是声明方式和打开游标时有些不同

CURSOR emp_test2(p_deptno emp.deptno%TYPE) IS --声明游标
       SELECT ename, job FROM emp WHERE deptno = p_deptno;

 OPEN emp_test2(10); --打开游标

 

游标变量:

定义游标变更类型
TYPE type_name IS REF CURSOR[RETURN return_type];

 

[java]  view plain copy
 
  1. CREATE OR REPLACE PROCEDURE cursorvariabletest(p_table IN VARCHAR2) IS  
  2.   TYPE t_emp_dept IS REF CURSOR; --定义游标变量类型  
  3.   v_cursorvar t_emp_dept; --声明游标变量  
  4.   
  5.   v_empno emp.empno%TYPE;  
  6.   v_ename emp.ename%TYPE;  
  7.   v_job   emp.job%TYPE;  
  8.   v_dname dept.dname%TYPE;  
  9.   v_loc   dept.loc%TYPE;  
  10.   
  11. BEGIN  
  12.   IF p_table = 'emp' THEN  
  13.     v_empno := 7369;  
  14.     OPEN v_cursorvar FOR  
  15.       SELECT ename, job FROM emp WHERE empno = v_empno; --打开游标变量  
  16.   ELSE  
  17.     IF p_table = 'dept' THEN  
  18.       OPEN v_cursorvar FOR  
  19.         SELECT dname, loc FROM dept; --打开游标变量  
  20.     ELSE  
  21.       raise_application_error(-20000'请输入emp或dept!');  
  22.     END IF;  
  23.   END IF;  
  24.   
  25.   LOOP  
  26.     IF p_table = 'emp' THEN  
  27.       FETCH v_cursorvar  
  28.         INTO v_ename, v_job;  
  29.       EXIT WHEN v_cursorvar%NOTFOUND;  
  30.       dbms_output.put_line('ename=' || v_ename || ',job=' || v_job);  
  31.     ELSE  
  32.       FETCH v_cursorvar  
  33.         INTO v_dname, v_loc;  
  34.       EXIT WHEN v_cursorvar%NOTFOUND;  
  35.       dbms_output.put_line('dname=' || v_dname || ',loc=' || v_loc);  
  36.     END IF;  
  37.   END LOOP;  
  38.   CLOSE v_cursorvar; --关闭游标变量  
  39. END;  

约束与无约束的游标变量
无约束的游标变量包含特定的返回类型(type,rowtype,record等),查询的选择列表必须匹配游标的返回类型,否则会出现预

定义的ROWTYPE_MISMATCH异常。约束的游标变量没有Return子句。

猜你喜欢

转载自wujay.iteye.com/blog/1960801