2009-06-17 41 views
0

所有,EXECUTE IMMEDIATE與使用條款,給予錯誤

我是很新的一般的存儲過程,但我與那些在甲骨文特別掙扎。我已經創建了一個非常簡單的例子,我正試圖完成這個簡化版本,但仍然遇到同樣的錯誤。

示例存儲過程如下:

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關鍵字應將v_strSQL內的編號佔位符(:1)替換爲存儲在中的值。但是,我不斷收到無效的表錯誤。我猜這是因爲EXECUTE IMMEDIATE由於某種原因無法用值替換佔位符,但我不確定這是爲什麼。有誰知道我是否在這裏做一些愚蠢的事情?

我使用PL/SQL Developer在Oracle 10g數據庫&上運行此操作。

+0

相關:[動態SQL爲什麼我不能使用綁定變量在DDL/SCL語句?](http://stackoverflow.com/q/25489002/1461424) – Krumia 2014-08-26 04:02:21

回答

1

USING子句僅用於綁定變量(即,您將在select語句中使用列名的位置),而不是表名。典型用法是這樣的:

Select col1 from table1 where col2 = :a 

如果你想使用變量表名稱中使用這樣的事:

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

謝謝Diederik! Oracle的執行層次結構使得使用佔位符動態更改表名和列名是不可能的。我對你的建議採取瞭解決方法。 – tundal45 2009-06-17 20:47:08