现在在函数A中创建了一个索引表,然后有个函数B需要传入这个索引表,在函数B接收的地方怎么命名类型,一般不都是什么什么%TYPE吗,这个接收的时候怎么写,在这个函数B里面我对这个索引表的纪录集进行了编辑,怎么返回函数A?谢谢,在线等,着急

解决方案 »

  1.   

    /* Formatted on 2007/08/22 11:00 (Formatter Plus v4.8.6) */
    CREATE OR REPLACE PACKAGE test01
    AS
    /******************************************************************************
       NAME:       test01
       PURPOSE:   REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        2007-8-17             1. Created this package.
    ******************************************************************************/
       TYPE account_record_type IS RECORD (
          ID     VARCHAR2 (20),
          NAME   VARCHAR2 (20)
       );   TYPE account_table_type IS TABLE OF account_record_type
          INDEX BY BINARY_INTEGER;   FUNCTION a
          RETURN INTEGER;   FUNCTION b (p_t IN account_table_type)
          RETURN account_table_type;
      
    END test01;
    //* Formatted on 2007/08/22 11:44 (Formatter Plus v4.8.6) */
    CREATE OR REPLACE PACKAGE BODY test01
    AS
    /******************************************************************************
       NAME:       test01
       PURPOSE:   REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        2007-8-17             1. Created this package.
    ******************************************************************************/
       FUNCTION a
          RETURN INTEGER
       IS
          v_i   INTEGER;
          v_t   account_table_type;
          v_r   account_record_type;
          v_p   account_table_type;
       BEGIN
          v_r.ID := '1';
          v_r.NAME := 'aa';
          v_t (1) := v_r;
          v_r.ID := '2';
          v_r.NAME := 'bb';
          v_t (2) := v_r;
          v_p := b (v_t);
         --用于查看funb的返回结果
          FOR i IN 1 .. v_p.COUNT
          LOOP
             v_r := v_p (i);
             DBMS_OUTPUT.put_line (v_r.ID || v_r.NAME);
          END LOOP;      v_i := v_p.COUNT;
          RETURN v_i;
       END a;   FUNCTION b (p_t IN account_table_type)
          RETURN account_table_type
       IS
          v_t   account_table_type;
          v_r   account_record_type;
       BEGIN      FOR i IN 1 .. p_t.COUNT
          LOOP
             v_r := p_t (i);
             v_r.NAME := v_r.NAME || 'funb';
     v_t(i):=v_r;
          END LOOP;      RETURN v_t;
       END b;
    END test01;
    /
    --toad test
    declare
    i integer;
    begin
    i:=test01.a;
    dbms_output.put_line(to_char(i));
    end;--测试结果
    1aafunb
    2bbfunb
    2
    --lz如果想用两个包也是可以的,只是调用的地方,还有类型的地方要加上包名
      

  2.   

    如果输入输出参数类型一样
    也可以这样
    FUNCTION b1 (p_t IN OUT account_table_type)
          RETURN integer;FUNCTION b1 (p_t IN OUT account_table_type)
          RETURN integer
      is
      v_r   account_record_type;
      v_i integer;
      BEGIN      FOR i IN 1 .. p_t.COUNT
          LOOP
             v_r := p_t (i);
             v_r.NAME := v_r.NAME || 'funb1';
     p_t(i):=v_r;
          END LOOP;      RETURN v_i;
       END b1;