`

oracle 存储过程使用实例

 
阅读更多
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旁边左边的按钮就行
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics