oracle - 如何使用 Execute Immediate 语句嵌套在 Execute Immediate 中
问题描述
我有一个固定的执行即时叙述。里面的sql_text只会带一个参数做一个简单的语法查询
例子
EXECUTE IMMEDIATE sql_text USING SN RETURNING INTO MSG;
sql_text 是可以交替使用的搜索语句
sql_txt = 'select count(1) from productDetails where ID = :parameter1'
本来EXECUTE IMMEDIATE只会带一个参数来执行sql_text。这次我想引入多个参数来执行sql_text,而不影响现有的只有一个参数的sql_text操作。
因此,许多尝试都失败了。错误的SQL如下
DECLARE
SQL_TEXT VARCHAR2(1000);
MSG VARCHAR2(500);
SN VARCHAR2(500) := parameter1/parameter2;
BEGIN
sql_text := '
DECLARE
parameters VARCHAR2(50);
parameter1 VARCHAR2(50);
parameter2 VARCHAR2(50);
sql_txt VARCHAR2(1000);
BEGIN
parameters := :SN;
parameter1 := substr(parameters,0,10);
parameter2 := substr(parameters,11,10);
sql_txt = ''select count(1) from productDetails where ID = :parameter1
AND NUMBER = :parameter2''
EXECUTE IMMEDIATE sql_txt USING parameter1 RETURNING INTO MSG;
END;';
EXECUTE IMMEDIATE sql_text USING SN RETURNING INTO MSG;
DBMS_OUTPUT.put_line(MSG);
END;
我试图将多个参数放入一个参数中。
SN VARCHAR2(500) := parameter1/parameter2;
从sql_text中取出参数并使用
parameters := :SN;
parameter1 := substr(parameters,0,10);
parameter2 := substr(parameters,11,10);
它不断尝试并失败
数据库版本:oracle database 19c
请求帮忙
谢谢
解决方案
您的“错误”SQL 有几个问题:
分配给 的末尾缺少一个分号
sql_text
。在同一语句中,
NUMBER
除非被引用,否则它不是 Oracle 中的有效标识符。的初始化
SN
需要在文本周围加上撇号。
所以作业sql_text
应该读
sql_txt := ''select count(1) from productDetails where ID = :parameter1
AND "NUMBER" = :parameter2'';
所以你的块应该是
DECLARE
SQL_TEXT VARCHAR2(1000);
MSG VARCHAR2(500);
SN VARCHAR2(500) := 'parameter1/parameter2';
BEGIN
sql_text := '
DECLARE
parameters VARCHAR2(50);
parameter1 VARCHAR2(50);
parameter2 VARCHAR2(50);
sql_txt VARCHAR2(1000);
BEGIN
parameters := :SN;
parameter1 := substr(parameters,0,10);
parameter2 := substr(parameters,11,10);
sql_txt = ''select count(1) from productDetails where ID = :parameter1
AND "NUMBER" = :parameter2'';
EXECUTE IMMEDIATE sql_txt USING parameter1 RETURNING INTO MSG;
END;';
EXECUTE IMMEDIATE sql_text USING SN RETURNING INTO MSG;
DBMS_OUTPUT.put_line(MSG);
END;
但是,可以通过使用以下方法大大简化上述内容:
SELECT COUNT(*)
INTO MSG
FROM PRODUCTDETAILS
WHERE ID = (SELECT REGEXP_SUBSTR(SN, '[^/]+', 1, 1) FROM DUAL) AND
"NUMBER" = (SELECT REGEXP_SUBSTR(SN, '[^/]+', 1, 2) FROM DUAL);
代替嵌入式动态 PL/SQL 块。所以如果我们创建PRODUCTDETAILS
使用
CREATE TABLE PRODUCTDETAILS(ID, "NUMBER", OTHER_FIELD) AS
SELECT 'parameter1', 'parameter2', 'DATA1' FROM DUAL UNION ALL
SELECT 'parameter1', 'parameter2', 'DATA2' FROM DUAL UNION ALL
SELECT 'parameter2', 'parameter3', 'DATA3' FROM DUAL UNION ALL
SELECT 'parameter3', 'parameter4', 'DATA4' FROM DUAL UNION ALL
SELECT 'parameter1', 'parameter2', 'DATA5' FROM DUAL UNION ALL
SELECT 'parameter4', 'parameter2', 'DATA6' FROM DUAL UNION ALL
SELECT 'parameter5', 'parameter6', 'DATA7' FROM DUAL
上述 SQL 将正确返回'3'
到 MSG。
推荐阅读
- python-3.x - Python3子进程:获取8位以上的进程返回码
- android - 使用超过 25 个航点/坐标的 MapBox 绘制路线/折线
- git - 为什么 Git 子树一遍又一遍地处理相同的提交?
- javascript - 检索可填充 PDF 的值并在 HTML 中的 Javascript 中使用
- visual-studio - 为什么不能使用 SQLProvider 连接到 SqlServer 并获取数据?
- python - 如何以 Google 文档字符串样式格式化长行参数描述
- javascript - 如何在不循环的情况下从 div 获取子元素?
- ios - 重新加载 UICollectionView 部分并保留滚动位置
- asciidoc - 如何在 asciidoc 中将单词的一部分斜体化
- pycharm - 文件级无检查 PyCharm