Oracle SQL:使用变量代替表名

13

我正在将一段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是变量表的名称,每次循环都会更改。 有人可以指出我做错了什么,或者给我一个有用的网站阅读链接吗?我已经读了一些关于此的教程,但到目前为止没有任何运气。

2个回答

24
  1. 您需要在表名和随后的WHERE子句之间加上一个空格。
  2. INTO需要成为EXECUTE IMMEDIATE的一部分,而不是动态SQL语句的一部分。
  3. 动态SQL语句不应该有尾随分号。
  4. 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

查询的INTO部分不应直接包含在查询字符串中。

语法

EXECUTE IMMEDIATE(<SQL>)
[INTO<variable>]
[USING <bind_variable_value>]

上述语法显示了EXECUTE IMMEDIATE命令。
INTO子句是可选的,仅在动态SQL包含检索值的SELECT语句时使用。变量类型应与SELECT语句的变量类型匹配。
USING子句是可选的,仅在动态SQL包含任何绑定变量时使用。

https://www.guru99.com/dynamic-sql-pl-sql.html#2

您可以访问此网站以更好地了解动态SQL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接