变量inclause不适用于PL / SQL

时间:2014-06-02 14:54:40

标签: sql oracle

我有这个PL / SQL代码片段RESTALLSEQUENCENUMBERLIST包含值'2,3,4'我将其转换为'2','3','4'为第三行中的in子句中的第二个声明。但是我的更新查询给了我无效的号码。有人可以帮忙吗

restAllSequenceNumberInList varchar2(100);

SELECT 
'''' || REPLACE( RESTALLSEQUENCENUMBERLIST, ',', ''',''' ) || '''' 
into restAllSequenceNumberInList FROM DUAL;

UPDATE THIRD_PARTY_LOOKUP 
SET ADDRESS_ID = firstSequenceNumber 
WHERE ADDRESS_ID in  (RESTALLSEQUENCENUMBERINLIST);

3 个答案:

答案 0 :(得分:1)

in子句不接受表示多个值的字符串参数。它是如此简单。如果您将单个字符串传递给in,则其行为与=相同。

您可以使用like

执行您想要的操作
UPDATE THIRD_PARTY_LOOKUP 
    SET ADDRESS_ID = firstSequenceNumber 
    WHERE ','||ADDRESS_ID||',' LIKE '%,' || RESTALLSEQUENCENUMBERLIST  || '%,';

但是,不是将列表存储在字符串中,为什么不将它们存储在临时表中?毕竟,表是为存储事物列表而明确设计的SQL构造。

答案 1 :(得分:0)

你不能在变量中传递逗号分隔列表并假设SQL将它们视为单独的值,试试这个

--replace with " not '
SELECT 
REPLACE '''' ||  REPLACE( RESTALLSEQUENCENUMBERLIST, ',', '","' ) || '''' 
into restAllSequenceNumberInList FROM DUAL;

--use xml to split them into rows
UPDATE THIRD_PARTY_LOOKUP 
SET ADDRESS_ID = firstSequenceNumber 
WHERE ADDRESS_ID in 
(SELECT EXTRACTVALUE(COLUMN_VALUE,'text()') VALS 
 FROM XMLTABLE(restAllSequenceNumberInList) )

答案 2 :(得分:0)

使用包含列表的单个字符串是不可能的。您需要使用以这种或那种方式拆分字符串生成的列表。不幸的是,没有“简单”的分割功能。有几种方法。