使用带有绑定变量的Execute Immediate语句时,表名称错误无效

Sat*_*hat 5 plsql dynamic-sql oracle10g execute-immediate

我正在尝试让这个动态SQL运行(使用EXECUTE IMMEDIATE)

M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 from :m_var2 RETURNING MAX(:m_var1)+1 INTO :m_var3';

EXECUTE IMMEDIATE M_SQL_STATEMENT
   USING M_COLUMN_NAME, UPPER(P_TABLE_NAME), M_COLUMN_NAME
   RETURNING INTO M_SEQ_NUMBER;
Run Code Online (Sandbox Code Playgroud)

但是,在尝试运行时,我一直在努力

ORA-00903: Invalid table
Run Code Online (Sandbox Code Playgroud)

P_TABLE_NAME是一个表名,可以作为输入接受.我已确认表名和列名有效.我无法弄清楚为什么Oracle会抛出错误.

FWIW将SQL语句更改为

M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 SEQ from :m_var2 RETURNING SEQ INTO :m_var3';
Run Code Online (Sandbox Code Playgroud)

仍会导致相同的错误.

Gre*_*lds 7

您需要将表名和列名放入动态SQL中,如下所示

M_SQL_STATEMENT := 'SELECT MAX(' || M_COLUMN_NAME || ')+1 from ' 
|| P_TABLE_NAME';

EXECUTE IMMEDIATE M_SQL_STATEMENT INTO M_SEQ_NUMBER;
Run Code Online (Sandbox Code Playgroud)

  • 不,不是,这就是首先使用动态SQL的全部理由:-) (3认同)