使用USING子句执行IMMEDIATE错误

时间:2009-06-17 18:34:27

标签: stored-procedures oracle10g dynamic-sql

所有

我对存储过程一般都很新,但我特别在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;

当我使用CALL ashish_test()调用上述存储过程时,我得到:

Error Message http://web1.twitpic.com/img/12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

根据this article(查看示例7-1),USING关键字应替换:1中编号的占位符(v_strSQL),其值应存储在{{ 1}}。但是,我一直收到无效的表错误。我猜这是因为v_tab由于某种原因无法用值替换占位符,但我不确定为什么会这样。有谁知道我在这里做些蠢事吗?

我在Oracle 10g数据库上运行它&使用PL / SQL Developer。

1 个答案:

答案 0 :(得分:1)

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

Select col1 from table1 where col2 = :a

如果要使用变量表名,请使用以下内容:

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;