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

时间:2014-08-22 10:27:35

标签: oracle plsql

我已经搜索了一些如何使用execute immediate从select语句返回值的示例,但它不断返回错误“ORA-00903:无效的表名”。

以下是代码示例:

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;

是的,表确实存在。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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

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

我还建议你在SQL注入的情况下为列和表名创建一个validation函数。

相关问题