2012-07-24 80 views
0
變量

可能重複:
UPSERT into table with dynamic table name甲骨文合併語句中的程序無法識別使用條款

下面的過程聲明爲這樣:

CREATE OR REPLACE 
PROCEDURE STUFF(tableToQuery VARCHAR2) AS 
BEGIN 
    MERGE INTO myTable m 
    USING (select * from tableToQuery) t 
    ON (m.id = t.id) 
... --other stuff 
END STUFF; 

我收到表明表名稱無效的ORA-00903錯誤。我的問題是如何獲取tableToQuery中的值等同於select語句中的有效表名?假設我不提前知道表名。

UPDATE

功能彙編現在,但是我目前收到未知的關鍵字錯誤在我的函數結束。

+0

「未知關鍵字」表示語法錯誤。唉,我們不是心靈感應。所以我們不能在你沒有發佈的代碼中發現語法錯誤。如果您使用動態SQL解決方案,則需要發佈您的過程生成的SQL語句。 – APC 2012-07-25 11:06:06

回答

3

您需要使用動態SQL:即在一個字符串中構造您的SQL語句,然後將該字符串傳遞給Oracle以使用execute immediate語句執行。

喜歡的東西

CREATE OR REPLACE 
PROCEDURE STUFF(tableToQuery IN VARCHAR2) AS 
    s varchar2(100); 
BEGIN 
    s := 'MERGE INTO myTable m' 
    || ' USING (select * from ' || tableToQuery || ') t' 
    || ' ON (m.id = t.id)'; 
    EXECUTE IMMEDIATE s; 
    --other stuff 
END STUFF; 

應該做的伎倆爲您服務。

NB不會傳遞參數tableToQuery中最終用戶(尤其是網絡上的用戶)的未經驗證的數據,因爲那樣您將會遇到SQL注入漏洞!

+0

正確的SQL注入:) – Woot4Moo 2012-07-24 14:37:20

+0

似乎要做的伎倆,將保持張貼 – Woot4Moo 2012-07-24 14:53:57

+0

我總是在動態SQL中引用Oracle標識符, ... from「'|| tableToQuery ||'」... ... 在Oracle中任何有效的表名(即使使用混合大小寫或空格等)也可以在我的動態代碼中工作。 – 2012-07-24 14:56:03