2017-12-27 4 views
0

Angenommen, ich habe eine Prozedur mit einem Benutzereingabeparameter.Pl sql Cursor mit Parameter in Bedingung

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); 

Es wird nicht kompiliert, da v_match_ID kein gültiger Bezeichner ist.

So ist die Ausführung sofort die einzige Option hier?

+2

Möchten Sie hier einen Spaltennamen oder ein Literal eingeben? Wenn 'V_MATCH_ID' ein Spaltenname ist, dann yes, müssen Sie execute direkt (oder DBMS_SQL) verwenden. – Ben

+0

@Ben ja, ich versuche, einen Spaltennamen zu übergeben. – dozel

+0

Ich weiß nicht, welche Frage, um dies als ein Duplikat zu schließen, weil es so viele Dinge gibt, die Sie tun könnten, aber hier sind einige relevante: https://stackoverflow.com/q/12956627/458741, https: // stackoverflow.com/q/15786953/458741, https://stackoverflow.com/q/25182858/458741 – Ben

Antwort

1

"Ich versuche, einen Spaltennamen zu übergeben"

In diesem Fall ja, müssen Sie dynamische SQL verwenden. Statt execute immediate müssen Sie wahrscheinlich eine Cursorvariable öffnen.

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||')'; 
Verwandte Themen