0

全部,

一般来说,我对存储过程很陌生,但我特别在 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()时,我得到:

错误消息 http://web1.twitpic.com/img/12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

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

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

4

1 回答 1

1

USING 子句仅适用于绑定变量(即您将在选择语句中使用列名的位置),而不适用于表名。典型用法如下所示:

Select col1 from table1 where col2 = :a

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

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
于 2009-06-17T19:52:22.113 回答