Stored procedures 使用WHERE子句中的变量时存储过程中的DELETE出现问题

Stored procedures 使用WHERE子句中的变量时存储过程中的DELETE出现问题,stored-procedures,oracle12c,sql-delete,Stored Procedures,Oracle12c,Sql Delete,我试图在执行后续插入之前删除SP中的一些记录。 当我在DELETE的WHERE子句中使用变量时,它不起作用。当我用它的值替换变量时,它会删除记录。我猜这是我把变量放在WHERE子句中做的事情,但我不知道它是什么。我尝试了不同的方法,但没有一种有效 PROCEDURE USPGETOUTCOME ( IPSITEMIDS VARCHAR2, .... CUR_OUT OUT GETDATACURSOR ) IS .... ....

我试图在执行后续插入之前删除SP中的一些记录。 当我在DELETE的WHERE子句中使用变量时,它不起作用。当我用它的值替换变量时,它会删除记录。我猜这是我把变量放在WHERE子句中做的事情,但我不知道它是什么。我尝试了不同的方法,但没有一种有效

PROCEDURE USPGETOUTCOME
(
IPSITEMIDS                VARCHAR2,
....
CUR_OUT                   OUT GETDATACURSOR
)
IS
....
....    
V_TEMP VARCHAR(200);
V_NEWITEMSLIST VARCHAR2(4000) := REPLACE(IPSITEMIDS, '''', '');


CURSOR cur IS
SELECT  REGEXP_SUBSTR(V_NEWITEMSLIST, '[^,]+', 1, LEVEL) V_NEWITEM2 FROM DUAL CONNECT BY instr(V_NEWITEMSLIST, ',',1, LEVEL -1) > 0;

BEGIN

-- IPSITEMIDS is ''EM060500103','LP060500105''   
V_TEMP := TRIM(BOTH '''' FROM IPSITEMIDS);

-- After above statement V_TEMP shows as 'EM060500103','LP060500105'

-- These don't work
--    DELETE FROM TEMPOUTCOME WHERE ITEMID IN (IPSITEMIDS);
--    DELETE FROM TEMPOUTCOME WHERE ITEMID IN (V_TEMP);
--    DELETE FROM TEMPOUTCOME WHERE ITEMID IN ('''|| V_TEMP ||''');
-- This works   
      DELETE FROM TEMPOUTCOME WHERE ITEMID IN ('EM060500103','LP060500105');
COMMIT;

-- This is using cursor to loop through each item and delete one by one; works but seems a waste!

-- Delete existing records from temp table for given ITEM IDs
FOR rec IN cur LOOP   
    V_NEWITEM := rec.V_NEWITEM2;
    DELETE FROM IDCTEMPOUTCOME WHERE ITEMID IN (V_NEWITEM);
END LOOP;
COMMIT;

您必须拆分这些值

看看我的例子

--      BANNER
-- 1    Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
-- 2    PL/SQL Release 11.2.0.2.0 - Production
-- 3    CORE    11.2.0.2.0  Production
-- 4    TNS for 64-bit Windows: Version 11.2.0.2.0 - Production
-- 5    NLSRTL Version 11.2.0.2.0 - Production

DECLARE
  l_n NUMBER;
  l_filter VARCHAR2(100) := '''PL/SQL Release 11.2.0.2.0 - Production'',''NLSRTL Version 11.2.0.2.0 - Production''';
BEGIN
  SELECT COUNT(banner) AS n INTO l_n FROM v$version where banner IN (select REGEXP_SUBSTR(l_filter, '\''(.*?)\''(?:\,)?', 1, LEVEL, NULL, 1) FROM dual CONNECT BY LEVEL <= REGEXP_COUNT(l_filter, '''(?: +)?(\,)(?: +)?''', 1) + 1);
  DBMS_OUTPUT.put_line(l_n);
END;

可能的重复似乎不适用于我的问题。为什么不呢?变量版本最终是一个带逗号的字符串,而不是工作版本中的逗号分隔字符串列表。这和复制的问题是一样的。我可以使用光标循环遍历每个项目ID并逐个删除记录,但在我看来,当整个事情都可以在查询中完成时,逐个删除记录将是一种浪费。我更新问题以显示光标版本。当我修剪A','B时,我不会得到像'A,B'这样的单个字符串;我得到了“A”和“B”,看起来像是硬编码的版本,但不知何故它不起作用,而硬编码的版本起作用。然后逐个删除?你能用我在原始帖子中声明的变量给出这个例子吗?不是Oracle的家伙,而是负责更新SP的C开发人员!你好@NoBullMan。您可以将我的SELECT语句更改为DELETE并一次将它们全部删除。这只是一个示例,它根据变量right的值显示匹配数,如您的示例所示。如果它不起作用,请告诉我。将l_过滤器更改为IPSTIMEIDS,这是项目ID的列表,用单引号括起来,并将SLEECT更改为DELETE,它可以在不需要循环每个项目ID的情况下工作。谢谢。