0

次の PL/SQL パッケージがあります。

CREATE OR REPLACE PACKAGE PKG_JCSJ
AS      
TYPE  record_organ_cant  IS RECORD(CANT_CODE VARCHAR2(90),
        ORGAN_ID  VARCHAR2(90) ,
        CANT_NAME VARCHAR2(90),
        SUPP_TYPE VARCHAR2(20));

  --TYPE array_organ_cant IS TABLE of PKG_JCSJ.record_organ_cant;
  TYPE array_organ_cant IS TABLE of pub_organ_cant%ROWTYPE;

  function fn_transe_organ_cant return PKG_JCSJ.array_organ_cant PIPELINED;
 END PKG_JCSJ;

create or replace package body PKG_JCSJ is

function fn_transe_organ_cant return PKG_JCSJ.array_organ_cant PIPELINED
as
   cursor cursor_organ_cant is select * from pub_organ_cant ; 
   record_o_c pub_organ_cant%rowtype; 
   record_o_c2 pub_organ_cant%rowtype;        
   cant_code VARCHAR2(90); 

   TYPE ref_cursor IS REF CURSOR; 
   array_column_value ref_cursor;  
   sp_cant_code VARCHAR2(90); 

begin
   open cursor_organ_cant;
   loop
        fetch cursor_organ_cant into record_o_c;
        exit when cursor_organ_cant%notfound;
        cant_code := record_o_c.cant_code;
        if instr(cant_code, ',')>0 then
           open array_column_value for select * from  table(fn_split(cant_code));
           loop
                fetch array_column_value into sp_cant_code;
                exit when array_column_value%notfound;
                --DBMS_OUTPUT.put_line('---' || sp_cant_code);
                record_o_c2.CANT_CODE := sp_cant_code;
                record_o_c2.ORGAN_ID := record_o_c.ORGAN_ID;
                record_o_c2.CANT_NAME := record_o_c.CANT_NAME;
                record_o_c2.SUPP_TYPE := record_o_c.SUPP_TYPE;
                --DBMS_OUTPUT.put_line('++++++' || record_o_c2.CANT_CODE);

                PIPE ROW (record_o_c2);
           end loop;
           close array_column_value;
        else   
           PIPE ROW (record_o_c);
        end if;
   end loop;
   close cursor_organ_cant;
   return;
end fn_transe_organ_cant;
begin
   null;
end PKG_JCSJ;

このステートメントが失敗するのはなぜですか?

TYPE array_organ_cant IS TABLE of PKG_JCSJ.record_organ_cant;

エラー情報がございますORA-06502: PL/SQL: numeric or value error。しかし、次のステートメントを使用すると、成功します。

TYPE array_organ_cant IS TABLE of pub_organ_cant%ROWTYPE;

record_organ_cantTABLE と同じ構造ですがpub_organ_cant、前者が失敗し、後者が成功する理由がわかりません。違いは何ですか?

次に、パッケージ本体を次のようにします。

4

1 に答える 1

0

まず第一に、パッケージPKG_JCSJ.内で宣言されており、そのような関数のいずれかにアクセスできる必要があるため、パッケージ本体では使用する必要はありません

create or replace package body PKG_JCSJ is
function fn_transe_organ_cant return array_organ_cant PIPELINED
....

PKG_JCSJ.次に、再度宣言すると、 likeは必要ありません

CREATE OR REPLACE PACKAGE PKG_JCSJ
AS      
  TYPE  record_organ_cant  IS RECORD(CANT_CODE VARCHAR2(90),
        ORGAN_ID  VARCHAR2(90) ,
        CANT_NAME VARCHAR2(90),
        SUPP_TYPE VARCHAR2(20));

  TYPE array_organ_cant IS TABLE of record_organ_cant;

  function fn_transe_organ_cant return array_organ_cant PIPELINED;
 END PKG_JCSJ;
于 2012-08-09T04:28:16.743 に答える