如何使用引用游标将拆分结果推送到数组 PL SQL 和 return 数组数据中

How to push a split results into array PL SQL and return array data with a ref cursor

我正在尝试将拆分结果推送到数组中,但我不知道该怎么做。这是我的存储过程:

   CODE_KZ_i NVARCHAR2 (4000):='';
   FTKZ NVARCHAR2 (4000):='';

   TYPE namesarray IS TABLE OF NVARCHAR2(4000);
   FTarray namesarray:=namesarray();
   i NUMBER;

开始

    FOR FTKZ IN ( SELECT REGEXP_SUBSTR (KZ,'[^;]+', 1,LEVEL)  TXT  FROM DUAL 
                  CONNECT BY REGEXP_SUBSTR (KZ,'[^;]+', 1, LEVEL) IS NOT NULL)

    LOOP

    FTarray.extend;

    IF CONTA = 0 THEN CODE_KZ:=FTKZ.TXT;
    ELSE 
    CODE_KZ:= FTKZ.TXT;

    END IF;

    FTarray(i):= CODE_KZ;
    DBMS_OUTPUT.put_line('FT:'|| FTarray(i));
    i:=i+1;
    CONTA:=CONTA+1;

我的目标是将 FTKZ.TXT 的结果推入 FTarray。有人可以帮我吗?

下一步是 return 数组的数据在 sys_refcursor 中。我在名为 KZ 的输入中得到了一些代码,我必须 return 另一个代码,链接到这个 table 中的 kz:SG_AN_FT

    open p_cur_result for
    SELECT DISTINCT FT.CODE as FT INTO P_RESULT FROM SG_AN_FT FT 
          INNER JOIN SG_BOM_PIVOT_PN_KZ BOM
          ON FT.ID = BOM.ID_FT
          INNER JOIN SG_AN_KZ K
          ON K.ID = BOM.ID_KZ
          WHERE K.CODE in (SELECT * FROM TABLE(cast(FTarray as FT));

    Errore(317,60): PL/SQL: ORA-00902: tipo di dati non valido

提前致谢

你的循环代码看起来很接近;为 KZ 添加定义和虚拟值并清理其他变量,您可以执行以下操作:

declare
  -- made up as not shown in the question
  KZ NVARCHAR2 (4000) := 'A;B;C;D';

  CODE_KZ NVARCHAR2 (4000);

  TYPE namesarray IS TABLE OF NVARCHAR2(4000);
  FTarray namesarray:=namesarray();
  CONTA NUMBER := 1;
begin
  FOR FTKZ IN ( SELECT REGEXP_SUBSTR (KZ,'[^;]+', 1,LEVEL)  TXT  FROM DUAL 
                CONNECT BY REGEXP_SUBSTR (KZ,'[^;]+', 1, LEVEL) IS NOT NULL)
  LOOP
    FTarray.extend;

    -- redundant as both branches do the same thing; also can't be zero
    IF CONTA = 0 THEN
      CODE_KZ:=FTKZ.TXT;
    ELSE 
      CODE_KZ:= FTKZ.TXT;
    END IF;

    FTarray(CONTA):= CODE_KZ;
    DBMS_OUTPUT.put_line('FT:'|| FTarray(CONTA));
    CONTA:=CONTA+1;
  END LOOP;
end;
/

PL/SQL procedure successfully completed.

FT:A
FT:B
FT:C
FT:D

您的 IF CONTA = 0 检查表明您从索引 0 开始循环,这将得到 ORA-06532: Subscript outside of limit 因为集合是从 1 而不是 0 开始索引的。无论如何,该检查似乎是多余的,因为您为两个分支中的变量分配了相同的值,因此您可以直接将 FTKZ.TXT 分配给新扩展的数组元素。你根本不需要 CONTACODE_KZ:

declare
  -- made up as not shown in the question
  KZ NVARCHAR2 (4000) := 'A;B;C;D';

  TYPE namesarray IS TABLE OF NVARCHAR2(4000);
  FTarray namesarray:=namesarray();
begin
  FOR FTKZ IN ( SELECT REGEXP_SUBSTR (KZ,'[^;]+', 1,LEVEL)  TXT  FROM DUAL 
                CONNECT BY REGEXP_SUBSTR (KZ,'[^;]+', 1, LEVEL) IS NOT NULL)
  LOOP
    FTarray.extend;
    FTarray(FTArray.count) := FTKZ.TXT;
    DBMS_OUTPUT.put_line('FT:'|| FTarray(FTArray.count));
  END LOOP;
end;
/

PL/SQL procedure successfully completed.

FT:A
FT:B
FT:C
FT:D

但你也不需要使用循环,you can use bulk collect to populate your collection in one go:

declare
  -- made up as not shown in the question
  KZ NVARCHAR2 (4000) := 'A;B;C;D';

  TYPE namesarray IS TABLE OF NVARCHAR2(4000);
  FTarray namesarray:=namesarray();
begin
  SELECT REGEXP_SUBSTR (KZ,'[^;]+', 1,LEVEL) TXT
  BULK COLLECT INTO FTarray
  FROM DUAL 
  CONNECT BY REGEXP_SUBSTR (KZ,'[^;]+', 1, LEVEL) IS NOT NULL;

  FOR i IN 1..FTarray.count LOOP
    DBMS_OUTPUT.put_line('FT:' || FTarray(i));
  END LOOP;
end;
/

PL/SQL procedure successfully completed.

FT:A
FT:B
FT:C
FT:D