如何使用引用游标将拆分结果推送到数组 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
分配给新扩展的数组元素。你根本不需要 CONTA
或 CODE_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
我正在尝试将拆分结果推送到数组中,但我不知道该怎么做。这是我的存储过程:
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
分配给新扩展的数组元素。你根本不需要 CONTA
或 CODE_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