通过 EXECUTE IMMEDIATE 从 select 语句中返回一个值

Posted

技术标签:

【中文标题】通过 EXECUTE IMMEDIATE 从 select 语句中返回一个值【英文标题】:Returning a value from a select statement through EXECUTE IMMEDIATE 【发布时间】:2014-08-22 10:27:34 【问题描述】:

我搜索了一些示例,说明如何使用立即执行从 select 语句中返回值,但它一直向我返回错误“ORA-00903: invalid table name”。

以下是代码示例:

DECLARE
  LAST_NUMBER NUMBER;

  CURSOR C_SEQUENCES IS
    SELECT
      A.SEQUENCE_NAME, B.TABLE_NAME, C.COLUMN_NAME
    FROM
      USER_SEQUENCES A
    INNER JOIN
      USER_CONSTRAINTS B ON A.SEQUENCE_NAME = REPLACE(B.CONSTRAINT_NAME, 'PK', 'SEQ_ID')
    INNER JOIN
      USER_CONS_COLUMNS C ON B.CONSTRAINT_NAME = C.CONSTRAINT_NAME
    WHERE
      B.CONSTRAINT_TYPE = 'P';

BEGIN
  FOR REG IN C_SEQUENCES LOOP
    EXECUTE IMMEDIATE 'SELECT MAX(:1) FROM :2' INTO LAST_NUMBER USING REG.COLUMN_NAME, REG.TABLE_NAME;
  END LOOP;
END;

是的,该表确实存在。

有什么想法吗?

【问题讨论】:

很遗憾,表名不能是绑定变量!您需要将其包含在字符串结构本身中! 谢谢@MaheswaranRavisankar,我不知道我怎么会忘记尝试这个。 =) 【参考方案1】:

我认为唯一的方法是将这两个变量连接起来:

EXECUTE IMMEDIATE 'SELECT MAX('||REG.COLUMN_NAME||') FROM '||REG.TABLE_NAME INTO LAST_NUMBER;

我还建议你为列名和表名创建一个validation函数,以防SQL注入。

【讨论】:

以上是关于通过 EXECUTE IMMEDIATE 从 select 语句中返回一个值的主要内容,如果未能解决你的问题,请参考以下文章

使用EXECUTE IMMEDIATE来生成含有绑定变量的SQL

执行 `EXECUTE IMMEDIATE` Oracle 语句出现错误

mariadb 10.2.3支持oracle execute immediate语法

Oracle 的 EXECUTE IMMEDIATE 与存储过程中的 LIKE 子句

execute immediate

EXECUTE IMMEDIATE 中的确切错误行号