plsql - 使用带有绑定(bind)变量的 Execute Immediate 语句时出现无效的表名错误

标签 plsql oracle10g dynamic-sql 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;

但是,当尝试运行它时,我一直遇到
ORA-00903: Invalid table

P_TABLE_NAME 是一个被接受为输入的表名。我已经确认表名和列名是有效的。我无法弄清楚为什么 Oracle 会抛出错误。

FWIW 将 SQL 语句更改为
M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 SEQ from :m_var2 RETURNING SEQ INTO :m_var3';

仍然导致相同的错误。

最佳答案

您需要将表名和列名放入动态 SQL 中,因此类似于

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

EXECUTE IMMEDIATE M_SQL_STATEMENT INTO M_SEQ_NUMBER;

关于plsql - 使用带有绑定(bind)变量的 Execute Immediate 语句时出现无效的表名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5259690/

相关文章:

Oracle10g数据库DMBS_CRYPTO错误

sql - 尝试创建大型动态查询时,不断被截断

sql - 是否可以在不使用group by子句的情况下计算表中每个组的总和

sql - Oracle 10g 中具有 CLOB 字段的表删除速度较慢

sql - 有没有办法刷新 Oracle 中 PL/SQL 的输出?

mysql - 如何查看准备好的语句或者我应该放弃动态表名称吗?

PostgreSQL:将列中的函数存储为值

oracle - 如何从 PL/SQL 过程执行 'describe table_name' 命令?

sql - 搜索sql函数

oracle - 在 PL/SQL 中动态创建 View 并使用 CLOB 时出现 ORA-00907