Oracle SQL:用于代替表名的变量

时间:2012-07-23 23:54:56

标签: sql oracle plsql

我正在将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 个答案:

答案 0 :(得分:17)

  1. 您需要在表名和后续WHERE子句
  2. 之间留一个空格
  3. INTO需要成为EXECUTE IMMEDIATE的一部分,而不是动态SQL语句的一部分。
  4. 动态SQL语句不应具有尾随分号
  5. EXECUTE IMMEDIATE语句应以分号结尾
  6. 将这些放在一起,这样的事情应该有效

    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。