如何将rowtype或RECORD当做参数传递给procedure????
如,我在触发器中定义
rowtype或RECORD
,然后将rowtype或RECORD作为参数,传递给procedure
,然后在procedure中处理数据,哪位大侠知道,麻烦告知,谢谢!!

解决方案 »

  1.   

    将存储过程定义在包里面,包头处声明record或者rowtype类型
      

  2.   

    TYPE XXX_TYPE
    IS 
    RECORD
    (
    a a.字段%TYPE,
    b b.字段%TYPE,
                            .
                            .
    );
    XXX_REC XXX_TYPE;
            在函数中使用该类型
            FUNCTION XXX
    (
    XXX_REC IN XXX_TYPE,
                        .
              .
    )
    RETURN NUMBER
    IS
    BEGIN
    ccc = XXX_REC.字段;
    EXCEPTION END XXX;
      

  3.   

    比如我的触发器这么写的:
    create or replace trigger TIA_T_RESULT_HEAD
      after insert on t_result_head
      for each ROW
    BEGIN
    Proc_EDI_Result(:new.Business_Type,
                       :new.Declare_Type,
                       :new.Check_Mark,
                       :new.Result_Type,
                       :new.Corp_No,
                       :new.Corp_Code,
                       :new.Appr_No,
                       :new.check_date);
    end TIA_T_RESULT_HEAD;
    ==============================
    因为参数有可能越来越多,我就想将各个字段的值,作为一个集合来传递给我的存储过程
    我的存储过程如下:
    create or replace procedure PROC_EDI_RESULT_1((P_Business_Type in varchar2,P_Declare_Type in varchar2,P_Check_Mark in char,P_Result_Type in char,P_Corp_No in varchar2,P_Corp_Code in varchar2,P_Ems_Appr_No in varchar2,P_CHECK_DATE in date) As
        V_Head_ID            varchar2(36);
        V_CancelDeclare_Flag char(1);
        V_CancelAudit_Flag   char(1);
        V_Count              number;
        V_Modify_times       number;
    begin
        case P_Business_Type
         When '01' Then 
         Begin
            Select nvl(Max(Ems_Head_ID),' ') into V_Head_ID From T_Ems_Head Where Corp_Ems_No = P_Corp_No And Current_Flag = '1';
            Select nvl(Max(CancelDeclare_Flag),'0') into V_CancelDeclare_Flag From T_Ems_Head Where Corp_Ems_No = P_Corp_No And Current_Flag = '1' And Query_Flag = '1';
            Select nvl(Max(CancelAudit_Flag),'0') into V_CancelAudit_Flag From T_Ems_Head Where Corp_Ems_No = P_Corp_No And Current_Flag = '1' And Query_Flag != '1';
    End;
    When '03' Then
    begin
      ....
      ....
    End;
    End Case;   exception
         When CASE_NOT_FOUND then
           dbms_output.put_line('业务类型:'|| P_Business_Type || '或回执类型:' || P_Check_Mark || '超过处理范围');
         When others then
           dbms_output.put_line('错误号:'||SQLCODE || ',错误信息:'||SQLERRM);
    end PROC_EDI_RESULT;
    --------------------
    哪位大侠能给个例子,谢谢!
      

  4.   

    SQL> desc ta
    Name Type   Nullable Default Comments 
    ---- ------ -------- ------- -------- 
    ID   NUMBER Y                         SQL> 
    SQL> create or replace procedure test_pro (v_rowtype1 ta%rowtype)
      2  as
      3  id number;
      4  v_rowtype ta.id%type;
      5  begin
      6  
      7  insert into ta values(id);
      8  insert into ta values(v_rowtype1.id);
      9  insert into ta values(v_rowtype);
     10  end test_pro;
     11  /Procedure createdSQL> 
      

  5.   

    以上的都不是我想要的。
    现在我换一种说法。比如:
    我不要在存储过程中处理数据了,我把它们放到触发器中处理,如下:
    create or replace trigger TIA_T_RESULT_HEAD
      after insert on t_result_head
      for each ROW 
    DECLARE
        P_Business_Type    t_result_head.business_type%TYPE;
        P_Check_Mark         t_result_head.check_%TYPE;
        P_Appr_fec_Code    t_result_head.appr_fec_code%TYPE;
        P_Appr_fec_Name   t_result_head.appr_fec_name%TYPE;     
    BEGIN
      P_Business_Type   := :new.Business_Type;
      P_Check_Mark       := :new.check_;
      P_Appr_fec_Code  := :new.appr_fec_code;
      P_Appr_fec_Name := :new.appr_fec_name;   exception
         When integrity_error then
           dbms_output.put_line('业务类型:'|| P_Business_Type || '或回执类型:' || P_Check_Mark || '超过处理范围');
         When others then
           dbms_output.put_line('错误号:'||SQLCODE || ',错误信息:'||SQLERRM);End TIA_T_RESULT_HEAD;===============================
    请问上面的是否有错误???
      

  6.   

    用PACKAGE 可变数组+行组触发器+表级触发器可以搞定:SQL> DESC EMP_TEST;
    Name     Type         Nullable Default Comments 
    -------- ------------ -------- ------- -------- 
    EMPNO    NUMBER(4)    Y                         
    ENAME    VARCHAR2(10) Y                         
    JOB      VARCHAR2(9)  Y                         
    MGR      NUMBER(4)    Y                         
    HIREDATE DATE         Y                         
    SAL      NUMBER(7,2)  Y                         
    COMM     NUMBER(7,2)  Y                         
    DEPTNO   NUMBER(2)    Y                         SQL> SELECT * FROM EMP_TEST;EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980-12-17     800.00               20Executed in 0.016 seconds-- package 代码:
    CREATE OR REPLACE PACKAGE SCOTT.PKG_TRIGGER_TEST  IS
      TYPE T_EMP IS TABLE OF SCOTT.EMP_TEST%ROWTYPE INDEX BY BINARY_INTEGER;
      V_EMPS T_EMP;
      V_NUM BINARY_INTEGER := 0;
    END ;-- 行级触发器得发NEW值:
    CREATE OR REPLACE TRIGGER SCOTT.GET_EMP_ROW
      AFTER INSERT ON SCOTT.EMP_TEST  
      FOR EACH ROW
    BEGIN
      DBMS_OUTPUT.PUT_LINE('-- TRIGGER SCOTT.GET_EMP_ROW START --');
      SCOTT.PKG_TRIGGER_TEST.V_NUM := SCOTT.PKG_TRIGGER_TEST.V_NUM + 1;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).EMPNO := :NEW.EMPNO;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).ENAME := :NEW.ENAME;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).JOB := :NEW.JOB;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).MGR := :NEW.MGR;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).HIREDATE := :NEW.HIREDATE;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).SAL := :NEW.SAL;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).COMM := :NEW.COMM;
      SCOTT.PKG_TRIGGER_TEST.V_EMPS(SCOTT.PKG_TRIGGER_TEST.V_NUM).DEPTNO := :NEW.DEPTNO;
      
    EXCEPTION
      WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE(SQLCODE||' : '||SQLERRM);
      
    END GET_EMP_ROW;-- 表级触发器得到最大工资等Operation:
    CREATE OR REPLACE TRIGGER SCOTT.TIA_T_RESULT_HEAD
      AFTER INSERT ON SCOTT.EMP_TEST
    DECLARE
      -- local variables here
      V_EMP_NO NUMBER;
      V_MANAGER_NO NUMBER;
      V_EMP_DATE DATE;
      V_DEPT_NO NUMBER;
      
      V_MAX_SALARY SCOTT.EMP_TEST.SAL%TYPE;
      
      V_STEP VARCHAR2(100) := '';
    BEGIN
      DBMS_OUTPUT.PUT_LINE('-- TRIGGER SCOTT.TIA_T_RESULT_HEAD START --');
      V_STEP := 'GET NEW VALUES';
      FOR I IN 1..SCOTT.PKG_TRIGGER_TEST.V_EMPS.COUNT LOOP
          V_EMP_NO     := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).EMPNO;
          V_MANAGER_NO := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).MGR;
          V_EMP_DATE   := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).HIREDATE;
          V_DEPT_NO    := SCOTT.PKG_TRIGGER_TEST.V_EMPS(I).DEPTNO;
          
          DBMS_OUTPUT.PUT_LINE('EMP_NO: '||V_EMP_NO||' MANAGER_NO: '||V_MANAGER_NO||' EMP_DATE: '||V_EMP_DATE||' DEPT_NO: '||V_DEPT_NO);
          
          V_STEP := 'GET MAX SALARY';
          SELECT NVL(MAX(SAL),0) 
            INTO V_MAX_SALARY 
            FROM SCOTT.EMP_TEST
           WHERE DEPTNO = V_DEPT_NO;
          
          V_STEP := 'PRINT MAX SALARY AFTER INSERTED RECORDS';
          DBMS_OUTPUT.PUT_LINE('MAX SALARY: '||V_MAX_SALARY);
          DBMS_OUTPUT.PUT_LINE('');
          
      END LOOP;
      
    EXCEPTION
      WHEN OTHERS THEN
           DBMS_OUTPUT.PUT_LINE('Error at : '||V_STEP);
           DBMS_OUTPUT.PUT_LINE(SQLCODE||' : '||SQLERRM);
    END TIA_T_RESULT_HEAD;-- 测试结果:
    SQL> INSERT INTO SCOTT.EMP_TEST
      2  SELECT 7768,'MANTISXF','SALESER',7369,SYSDATE,3000,NULL,30 FROM DUAL
      3  UNION ALL
      4  SELECT 7780,'FENG','MONTIORER',7368,SYSDATE,5000,NULL,20 FROM DUAL
      5  ;-- TRIGGER SCOTT.GET_EMP_ROW START --
    -- TRIGGER SCOTT.GET_EMP_ROW START --
    -- TRIGGER SCOTT.TIA_T_RESULT_HEAD START --
    EMP_NO: 7768 MANAGER_NO: 7369 EMP_DATE: 28-9月 -08 DEPT_NO: 30
    MAX SALARY: 3000EMP_NO: 7780 MANAGER_NO: 7368 EMP_DATE: 28-9月 -08 DEPT_NO: 20
    MAX SALARY: 5000
    2 rows insertedExecuted in 0.25 secondsSQL> COMMIT;Commit completeExecuted in 0 secondsSQL> SELECT * FROM EMP_TEST;EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980-12-17     800.00               20
     7768 MANTISXF   SALESER    7369 2008-9-28 1   3000.00               30
     7780 FENG       MONTIORER  7368 2008-9-28 1   5000.00               20Executed in 0.031 secondsSQL> INSERT INTO SCOTT.EMP_TEST VALUES(8866,'CSDN','MANAGER',7369,SYSDATE,8000,NULL,10);-- TRIGGER SCOTT.GET_EMP_ROW START --
    -- TRIGGER SCOTT.TIA_T_RESULT_HEAD START --
    EMP_NO: 7768 MANAGER_NO: 7369 EMP_DATE: 28-9月 -08 DEPT_NO: 30
    MAX SALARY: 3000EMP_NO: 7780 MANAGER_NO: 7368 EMP_DATE: 28-9月 -08 DEPT_NO: 20
    MAX SALARY: 5000EMP_NO: 8866 MANAGER_NO: 7369 EMP_DATE: 28-9月 -08 DEPT_NO: 10
    MAX SALARY: 8000
    1 row insertedExecuted in 0.015 secondsSQL> COMMIT;Commit completeExecuted in 0.015 secondsSQL> SELECT * FROM EMP_TEST;EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
     7369 SMITH      CLERK      7902 1980-12-17     800.00               20
     7768 MANTISXF   SALESER    7369 2008-9-28 1   3000.00               30
     7780 FENG       MONTIORER  7368 2008-9-28 1   5000.00               20
     8866 CSDN       MANAGER    7369 2008-9-28 1   8000.00               10Executed in 0.015 seconds