oracle 存储过程的基本语法

1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程
名字
(
   
参数1 IN NUMBER,
   
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN

END 存储过程名字

2.SELECT INTO STATEMENT
 
select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
 
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
 
例子:
  BEGIN
  SELECT col1,col2 into
变量1,变量2 FROM typestruct where xxx;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      xxxx;
  END;
  ...

3.IF
判断
  IF V_TEST=1 THEN
    BEGIN
       do something
    END;
  END IF;

4.while
循环
  WHILE V_TEST=1 LOOP
  BEGIN
 XXXX
  END;
  END LOOP;

5.
变量赋值
  V_TEST := 123;

6.
for in 使用cursor
  ...
  IS
  CURSOR cur IS SELECT * FROM xxx;
  BEGIN
 FOR cur_result in cur LOOP
  BEGIN
   V_SUM :=cur_result.
列名1+cur_result.列名2
  END;
 END LOOP;
  END;

7.
带参数的cursor
  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
  OPEN C_USER(
变量值);
  LOOP
 FETCH C_USER INTO V_NAME;
 EXIT FETCH C_USER%NOTFOUND;
    do something
  END LOOP;
  CLOSE C_USER;

8.pl/sql developer debug
 
连接数据库后建立一个Test WINDOW
 
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

  1. 存储过程 包含三部分: 声明,执行部分,异常。   
  2. 可以有无参数程序和带参数存储过程。   
  3. 无参程序语法   
  4. 1 create or replace procedure NoParPro   
  5. 2 as    ;   
  6. 3 begin   
  7. 4   ;   
  8. 5 exception   
  9. 6       ;   
  10. 7 end;   
  11. 8   
  12.   
  13.     带参存储过程实例   
  14. 1 create or replace procedure queryempname(sfindno emp.empno%type) as   
  15. 2         sName emp.ename%type;   
  16. 3         sjob emp.job%type;   
  17. 4 begin   
  18. 5         ....   
  19. 7 exception   
  20.            ....   
  21. 14 end;   
  22. 15   
  23.   
  24.     带参数存储过程含赋值方式   
  25. 1 create or replace procedure runbyparmeters   (isal in emp.sal%type,   
  26.                              sname out varchar,sjob in out varchar)   
  27. 2   as icount number;   
  28. 3   begin   
  29. 4        select count(*) into icount from emp where sal>isal and job=sjob;   
  30. 5       if icount=1 then   
  31. 6          ....   
  32. 9       else  
  33. 10          ....   
  34. 12        end if;   
  35. 13   exception   
  36. 14        when too_many_rows then   
  37. 15        DBMS_OUTPUT.PUT_LINE('返回值多于1');   
  38. 16        when others then   
  39. 17        DBMS_OUTPUT.PUT_LINE('RUNBYPARMETERS过程中出错!');   
  40. 18   end;   
  41. 19   
  42.   
  43.    过程调用   
  44.    方式一   
  45. 1 declare   
  46. 2         realsal emp.sal%type;   
  47. 3         realname varchar(40);   
  48. 4         realjob varchar(40);   
  49. 5   begin   
  50. 6         realsal:=1100;   
  51. 7         realname:='';   
  52. 8         realjob:='CLERK';   
  53. 9         runbyparmeters(realsal,realname,realjob);      --必须按顺序   
  54. 10         DBMS_OUTPUT.PUT_LINE(REALNAME||'    '||REALJOB);   
  55. 11   END;   
  56. 12   
  57.   
  58.    方式二   
  59. 1 declare   
  60. 2        realsal emp.sal%type;   
  61. 3        realname varchar(40);   
  62. 4        realjob varchar(40);   
  63. 5 begin   
  64. 6        realsal:=1100;   
  65. 7        realname:='';   
  66. 8        realjob:='CLERK';   
  67. 9        runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob);   --指定值对应变量顺序可变   
  68. 10        DBMS_OUTPUT.PUT_LINE(REALNAME||'    '||REALJOB);   
  69. 11 END;   
  70. 12