Oracle存储过程无法正常工作(字符串中的位置)

时间:2011-03-31 17:36:56

标签: oracle stored-procedures where-in

这是我的整个存储过程:

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

3 个答案:

答案 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;