我正在将MSSQL脚本转换为Oracle,我无法弄清楚使用变量代替表名或列的语法。
这是一个简单的例子,我一直在尝试在Oracle SQL Developer中工作,这样我就能更好地理解语法:
set serveroutput on format wrapped;
declare
VR_TABLE VARCHAR2(256);
VR_UPDATE VARCHAR2(256);
begin
VR_TABLE :='SYSTEM_STATUS';
EXECUTE IMMEDIATE 'select UPDATE_VERSION INTO VR_UPDATE from ' || VR_TABLE || 'where rownum < 2 ;'
end;
其中VR_TABLE是变量表名,它将在循环的每次迭代中被更改。 有人可以指出我做错了什么,或者将我链接到一个对我有用的网站吗?我已经阅读了一些关于此的教程,但到目前为止我还没有运气。
答案 0 :(得分:17)
WHERE
子句INTO
需要成为EXECUTE IMMEDIATE
的一部分,而不是动态SQL语句的一部分。EXECUTE IMMEDIATE
语句应以分号结尾将这些放在一起,这样的事情应该有效
declare
VR_TABLE VARCHAR2(256);
VR_UPDATE VARCHAR2(256);
begin
VR_TABLE :='SYSTEM_STATUS';
EXECUTE IMMEDIATE 'select UPDATE_VERSION from ' || VR_TABLE || ' where rownum < 2'
INTO VR_UPDATE;
end;
当然,由于您没有对VR_UPDATE
执行任何操作,因此执行此匿名块时不会显示任何内容。
答案 1 :(得分:0)
查询的INTO部分不应直接包含在查询中 字符串。
语法
EXECUTE IMMEDIATE(<SQL>)
[INTO<variable>]
[USING <bind_variable_value>]
以上语法显示了 EXECUTE IMMEDIATE 命令。
Clause INTO 是可选的,并且仅在动态 SQL 包含提取值的 select 语句时使用。变量类型应与 select 语句的变量类型匹配。
USING 子句是可选的,仅当动态 SQL 包含任何绑定变量时才使用。
https://www.guru99.com/dynamic-sql-pl-sql.html#2
您可以访问此站点以更好地了解动态 SQL。