所有

我对存储过程一般都很新,但我特别在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 关键字应该用 v_strSQL 中的编号占位符(:1 )替换存储的值在 v_tab 中。但是,我一直收到无效的表错误。我猜这是因为 EXECUTE IMMEDIATE 由于某种原因无法用值替换占位符,但我不确定为什么会这样。有谁知道我在这里做些蠢事吗?

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

有帮助吗?

解决方案

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

Select col1 from table1 where col2 = :a

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

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top