Stored procedures 使用USING子句执行IMMEDIATE,并给出错误

Stored procedures 使用USING子句执行IMMEDIATE,并给出错误,stored-procedures,oracle10g,dynamic-sql,Stored Procedures,Oracle10g,Dynamic Sql,全部, 一般来说,我对存储过程非常陌生,但我特别是在Oracle中的存储过程方面遇到了困难。我已经创建了一个非常简单的示例来说明我正在尝试完成的任务,但在这个简化版本中,我仍然会遇到同样的错误 示例存储过程如下所示: CREATE OR REPLACE PROCEDURE ashish_test AUTHID CURRENT_USER IS BEGIN DECLARE v_tab VARCHAR2(50); v_strSQL VARCH

全部,

一般来说,我对存储过程非常陌生,但我特别是在Oracle中的存储过程方面遇到了困难。我已经创建了一个非常简单的示例来说明我正在尝试完成的任务,但在这个简化版本中,我仍然会遇到同样的错误

示例存储过程如下所示:

CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
     DECLARE
          v_tab     VARCHAR2(50);
          v_strSQL  VARCHAR2(50);
     BEGIN
          v_strSQL := 'SELECT * FROM :1';
          v_tab    := 'ex.emp';
          EXECUTE IMMEDIATE v_strSQL USING v_tab;
     END;
END;
当我使用调用ashish_test()调用上述存储过程时,我得到:

基于(参见示例7-1),
使用
关键字应将
v_strSQL
中的编号占位符(
:1
)替换为存储在
v_选项卡
中的值。但是,我不断得到无效表错误。我猜这是因为由于某种原因,
executeimmediate
无法将占位符替换为该值,但我不确定这是为什么。有人知道我在做什么蠢事吗


我正在Oracle10g数据库上运行此命令&使用PL/SQLDeveloper。

using子句仅用于绑定变量(即,在select语句中使用列名),而不是表名。典型用法如下所示:

Select col1 from table1 where col2 = :a
         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
如果要使用变量表名称,请使用以下内容:

Select col1 from table1 where col2 = :a
         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;

谢谢迪德里克!奇怪的是,Oracle的执行层次结构使得无法使用占位符动态更改表名和列名。我同意你的建议,一个绑定变量只能保存一个原子值,它不能引用结果集。FROM子句只能引用结果集(例如,您不能“SELECT*FROM'abc'”),因此绑定变量在该上下文中没有意义。此“变通方法”正是您可以动态更改查询所作用的结果集的方法。相关: