oracle 存储过程使用实例

来源:互联网 发布:mac怎么充电器怎么连接 编辑:程序博客网 时间:2024/05/19 00:47
1.建包

CREATE OR REPLACE PACKAGE PKG_XXX IS       PROCEDURE proc_main ;       PROCEDURE proc_xx1  ;       PROCEDURE proc_xx1_rule(TABLE_NAME  IN VARCHAR2,xxx_NAME IN VARCHAR2);END PKG_AM_EXP_PREWARNINGS;


2.建包体

CREATE OR REPLACE PACKAGE BODY PKG_XXX IS  --定义时间  主要用于查询  default_date constant VARCHAR2(10) := TO_CHAR(SYSDATE, 'YYYY-MM-DD');  --定义字符串数组类型  TYPE T_ARRAY IS ARRAY(50) OF VARCHAR2(20);  --返回字符串数组函数  FUNCTION GETARR RETURN T_REGION_ARRAY IS    var_array T_ARRAY;  BEGIN    var_array := T_ARRAY('',                                    '',                                '');    RETURN var_array;  END GETARR;      --主存储过程调用其他存储过程       PROCEDURE proc_main AS       BEGIN         proc_xx1();         proc_xx1_rule('','');       END proc_prewarning_main;                    procedure proc_xx1 AS          --定义字符串数组         type region_array is varray(50) of varchar2(20);                    var_array1 region_array:=region_array('1','2',                       '2','3','2',                       '2','2','2','1','2');         var_array2 region_array:=region_array('1','2',                       '2','3','2',                       '2','2','2','1','2');         var_array3 region_array:=region_array('1','2',                       '2','3','2',                       '2','2','2','1','2');         BEGIN                     for i in 1..var_array1.count loop             PROC_LOAD_xx('AM_EXP_DEVICE_T',var_array1(i));           end loop ;                        for i in 1..var_array2.count loop             DBMS_OUTPUT.put_line(123);             PROC_LOAD_xx('AM_EXP_WORK_CONDITION_T',var_array2(i));           end loop ;                        for i in 1..var_array3.count loop             PROC_LOAD_xx('AM_EXP_USEELECTRIC_T',var_array3(i));           end loop ;         END proc_prewarning_all_wud;             PROCEDURE PROC_LOAD_xx(TABLE_NAME  IN VARCHAR2,                                       xxx_NAME IN VARCHAR2) IS         SQLSTR         VARCHAR2(1500);         TYPENAME       VARCHAR2(20);       BEGIN         IF TABLE_NAME = 'AM1' THEN           TYPENAME := '3';         ELSIF TABLE_NAME = 'AM2' THEN           TYPENAME := '2';         ELSE           TYPENAME := '1';         END IF;                SQLSTR := '';                 EXECUTE IMMEDIATE SQLSTR           into xx, xx, xx;                 COMMIT;       EXCEPTION         WHEN OTHERS THEN           ROLLBACK;       END proc_xx1;         procedure proc_xx1_rule(REGION_NAME IN VARCHAR2) IS    SQLSTR         VARCHAR2(1500);    --定义一个游标属性    type RESULT_CUR is ref cursor;    RESULT_CUR_REF   RESULT_CUR;    --定义数组    type region_array is varray(50) of varchar2(20);   BEGIN    var_array1 region_array:=region_array('1','2',                       '2','3','2',                       '2','2','2','1','2');    for i in 1 .. var_array1.count loop      SQLSTR := '拼接SQL'      ;      DBMS_OUTPUT.put_line(SQLSTR);      --游标结合SQL字符串      OPEN RESULT_CUR_REF FOR SQLSTR;      --插入相关信息      loop        fetch RESULT_CUR_REF          into xx, xx, xx, xx;        exit when RESULT_CUR_REF%NOTFOUND;        --对取得的数据进行操作      end loop;    end loop;      COMMIT;  EXCEPTION    WHEN OTHERS THEN      ROLLBACK;  END proc_xx1_rule;END PKG_XXX; 


3.主要的地方

A.包中定义的存储过程如果没有参数则不需要括号。
B.包和包体中的存储过程要一一对应。
C.type region_array is varray(50) of varchar2(20); 是定义数组的意思。
D.定义一个游标属性 type RESULT_CUR is ref cursor;RESULT_CUR_REF   RESULT_CUR;

4.存储过程的DEBUG调试

1.首先右键该存储过程点击Add Debug Information
2.然后右键该存储过程点击Test
3.然后输入需要的参数或不输入
4.然后右键该存储过程点击View 点击行号出现红色叉叉表示断点
5.然后回到Test页面点击F9或页面上最左边的按钮 然后点击Run 一步一步执行则点击Run旁边左边的按钮就行
0 0