1

这是我的整个存储过程:

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 并让它像 WHERE CTA_DIVISION in ('TPA','CFL') 一样运行,返回 2 行数据,但这并没有发生。它不返回任何行。我需要更改什么才能传递该字符串并返回 2 行?TIA

4

3 回答 3

4

我认为您可以调整Oracle:将列表作为绑定变量传递以适合您的情况。

要使 varchar2 作为列表或单个值工作,您需要将其解析pDivisionList为一个数组(可能是一个值)并将其传递给另一个过程(可以在您的过程中定义。)

WRT 对@frustratedwithformsdesigner 的解决方案,动态sql 容易受到sql-injection 的影响。请注意此类解决方案。

于 2011-03-31T17:45:03.217 回答
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.

于 2011-03-31T17:42:40.000 回答
0

一个更简单的方法是:

SELECT distinct CTA_DIVISION
FROM cti_account 
WHERE INSTR(','||pDivisionList||',', ','||CTA_DIVISION||',') > 0;
于 2011-04-01T06:14:57.897 回答