例如以下伪代码:
CREATE OR REPLACE FUNCTION TestFunc(col TABLE_TYPE) RETURN VARCHAR IS
BEGINFOR i in col.firstVal..col.lastVal LOOP
Do something;
End LOOP;RETURN something;END;传进去的参数是类似于表的集合类型TABLE_TYPE,可以用for循环依次取得每一行数据值。
问题是这个TABLE_TYPE如何定义,在哪里定义?Oracle自带这样的数据类型吗

解决方案 »

  1.   

    用%Rowtype类型参数就可以,可参考如下 Declare
      Type Tabletype Is Table Of Davistest%Rowtype;
      Tablerec Tabletype := Tabletype();
      Procedure Testproc(Prec Davistest%Rowtype)
      Is 
       Pragma Autonomous_Transaction;
      Begin
        Insert Into Davistest Values Prec;
    Commit;
      End;
    Begin
      Tablerec.Extend(1);
      Tablerec(1).Name := 'Jack';
      Tablerec(1).Course := 'English';
      Tablerec(1).Score := 88;
      Testproc(Tablerec(1));
      --Tablerec(2).Name := 'Davis';
      --Tablerec(2).Course := 'Math';
      --Tablerec(2).Score := 83;  
      --Forall I In Tablerec.First .. Tablerec.Last
       --Insert Into Davistest Values Tablerec(I);
    End;  
      

  2.   

    要用到ref cursor类型一,利用package创建一个ref cursor类型TAB_TYPEcreate or replace package pkg_const as 
      type TAB_TYPE is ref cursor; 
    end pkg_const; 
    /二, 利用表emp返回TAB_TYPE类型的数据CREATE OR REPLACE procedure emp_select(out_tab OUT PKG_CONST.TAB_TYPE) IS
    BEGIN
      OPEN out_tab FOR SELECT * FROM emp;
    END;
    /三. 取得emp表的数据DECLARE
      l_tab PKG_CONST.TAB_TYPE;
      l_tab_row EMP%ROWTYPE;
    BEGIN
      EMP_SELECT(l_tab);
      
      loop
        FETCH l_tab INTO l_tab_row;
           EXIT WHEN l_tab%NOTFOUND;
           DBMS_OUTPUT.PUT_LINE('Name = ' || l_tab_row.ename);
      end loop;
    END;
    /