stored-procedures - 在 WHERE 子句中使用变量的存储过程中的 DELETE 问题
问题描述
我试图在进行后续插入之前删除 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;
推荐阅读
- azure-devops - 在 Azure DevOps 中安排每个部署时如何设置批准
- scala - 使用 sbt-native-packager 为我的 sbt 项目获取 docker 支持时出错
- c - 试图重建 itoa 功能
- c++ - 使用 NvPipe 编码桌面复制 API ID3D11Texture2D 帧
- privacy - 谷歌的“继续为”登录弹出窗口是否构成隐私威胁?
- python - 使用函数 scipy.integrate.RK45 求解耦合微分方程
- android - 更改 Google 水印 GoogleMaps SDK
- r - 在R ggplot2中将gtable转换为ggplot
- r - 闪亮的组合输入
- excel - 根据每行的另一个单元格清除单元格内容