2017-12-27 205 views
0

假設我有一個包含用戶輸入參數的過程。帶條件參數的sql遊標

Create procedure Match_Record(v_match_ID) 

Cursor match is 
Select * 
From table A 
Where not exists(select ‘bbb’ from table B 
           Where a. v_match_ID = b. v_match_ID); 

它不會編譯,因爲v_match_ID不是一個有效的標識符。

那麼是立即執行唯一的選擇嗎?

+2

您是否試圖在這裏傳遞列名或文字?如果'V_MATCH_ID'是列名,那麼是的,你需要使用立即執行(或DBMS_SQL)。 – Ben

+0

@Ben是的,我試圖傳遞一個列名。 – dozel

+0

我不知道有什麼問題可以作爲複本來關閉它,因爲有很多事情你可能會做,但這裏有一些相關的:https://stackoverflow.com/q/12956627/458741,https:// stackoverflow.com/q/15786953/458741,https://stackoverflow.com/q/25182858/458741 – Ben

回答

1

「我想傳遞一個列名」

在這種情況下,是的,你需要使用動態SQL。可能你需要打開一個遊標變量,而不是execute immediate

Create procedure Match_Record(v_match_ID) 
    ... 
    rc sys_refcursor; 
begin 
    open rc for 
     'Select * 
     From table A 
     Where not exists(select blah from table B 
          Where a.'||v_match_ID||' = b.'|| v_match_ID||')';