这是我的整个存储过程:
CREATE OR REPLACE PROCEDURE "CTI"."TEMP_DIVISION"
(
pDivisionList in varchar2,
out_cursor out SYS_REFCURSOR
)
as
begin
open out_cursor for
SELECT distinct CTA_DIVISION
FROM cti_account
WHERE CTA_DIVISION in (pDivisionList);
END;
如果我传入TPA,则返回TPA为1行(正确)。如果我传入CFL,则返回CFL为1行(正确)。但是,我想要做的是传递TPA,CFL并让它像('TPA','CFL')中的WHERE CTA_DIVISION一样运行,返回2行数据,但这并没有发生。它没有返回任何行。我需要更改什么才能传入该字符串并返回2行? TIA
答案 0 :(得分:4)
我认为您可以根据自己的情况调整Oracle: passing a list as bind variable。
要使varchar2作为列表或单个值工作,您需要将pDivisionList
解析为一个数组(可能是一个值)并将其传递给另一个过程(可以在您的过程。)
WRT到@frustratedwithformsdesigner的解决方案,动态sql容易受到sql注入。小心这些解决方案。
答案 1 :(得分:0)
这可以通过动态SQL完成。像这样构建查询:
sql_str := 'SELECT distinct CTA_DIVISION
FROM cti_account
WHERE CTA_DIVISION in ('||pDivisionList||')';
然后在其上使用execute immediate
。当然,您必须确保将pDivisionList
格式化为"'a','b','c'"
。
当然,动态SQL存在潜在的SQL注入问题,因此请确保您完全控制进入pDivisionList
的内容。
答案 2 :(得分:0)
更简单的方法是:
SELECT distinct CTA_DIVISION
FROM cti_account
WHERE INSTR(','||pDivisionList||',', ','||CTA_DIVISION||',') > 0;