2016-04-11 19 views
1

I unter Verwendung eines Verfahrens execute immediate erstellt, wenn ich debuggen und zu execute immediate in diesem Verfahren Schritt über, es zeigt die folgende Meldung:Wird UPDATE und CONNECT BY unterstützt?

Eine Oracle-Ausnahme im Code aufgetreten ist. Wenn der Code einen Ausnahmebehandler enthält, können Sie den Handler weiter durchlaufen. Andernfalls wird die Fehlermeldung angezeigt und der nächste Schritt beendet die Ausführung.

und dann habe ich die Abfrage herausnehmen, die Abfrage in ausführen sofort ist:

update mstarea 
set '||v_temp_position||' = :pid 
where areacode = :pnewarea1 
connect by prior areacode = areaparent 
start with areacode in (:pnewarea1, :pnewarea2); 

und ich versuchen, diese Abfrage auszuführen/kompilieren, hat es einen Fehler wie folgt aus:

ORA-00933: SQL-Befehl nicht richtig beendet

Ist connect by prior mitunterstützt?

Dies ist mein Verfahren, und der Fehler ist unter update mstarea, wenn es erreicht.

CREATE OR REPLACE procedure PROC1(pid in varchar2, pposition in varchar2, pnewarea1 in varchar2, pnewarea2 in varchar2) 
is 
v_error_message varchar2(255); 
v_temp_position varchar2(25 byte); 
v_sql_statement varchar2(255); 
n_count_role number; 
cursor cuser is 
    select userid from master.mstuser where id = pid; 
begin 
    for cdata in cuser 
    loop 
     begin 
      select count(role) into n_count_role from mstmapping where role = pposition; 
      if n_count_role > 0 then 
      begin 
       .......... 
       if pnewarea1 = 'ALL' then 
        .......... 
       else 
        .......... 
        ------------------- update mstarea ------------------- 
        if pposition in ('A', 'B') then 
         select 'AB' into v_temp_position from dual; 
        else 
         select pposition into v_temp_position from dual; 
        end if; 
        v_sql_statement := 'update mstarea set '||v_temp_position||' = :pid where areacode = :pnewarea1 connect by prior areacode = areaparent start with areacode in (:pnewarea1, :pnewarea2)'; 
        execute immediate v_sql_statement using pid, pnewarea1, pnewarea1, pnewarea2; -- advice from @Rene 
        ------------------------------------------------------ 
        .......... 
        end; 
       end if; 
      end; 
      end if; 
      exception 
      when others then 
      .......... 
     rollback; 
     end; 
    commit; 
    exit when cuser%notfound; 
    end loop; 
end; 

Was soll ich tun, um dies zu beheben?

+0

danke für die Bearbeitung meiner Frage @Jonny –

+1

Wird 'connect by prior' mit' update' unterstützt? - Nein, es ist nicht: https://docs.oracle.com/database/121/SQLRF/statements_10008.htm#SQLRF01708 –

+0

@a_horse_with_no_name danke für die Informationen, Sir! –

Antwort

1

Zooming auf gerade diesen Teil des Codes in:

v_sql_statement := 'update mstarea 
        set '||v_temp_position||' = :pid 
        where areacode = :pnewarea1 
        connect by prior areacode = areaparent 
        start with areacode in (:pnewarea1, :pnewarea2)'; 

execute immediate v_sql_statement       
using pid, pnewarea1, pnewarea2; 

Sie haben vier Variablen in der Abfrage. Obwohl zwei von ihnen den gleichen Namen haben, müssen Sie für jede Position einen Wert angeben. Um dies zu beheben Verwendung pnewarea1 zweimal:

execute immediate v_sql_statement       
    using pid, pnewarea1, pnewarea1, pnewarea2; 

- Edit ----

Schlussfolgerung ist, dass update .. connect by prior nicht in Oracle unterstützt.

+0

oh, ok, vielen Dank für den Hinweis @Rene, ich habe diesen Parameter hinzugefügt, aber immer noch einen gleichen Fehler. ist es von der Aussage? oder so? –

+0

Ohne den eigentlichen Fehler ist es schwer eine Antwort zu geben. Nehmen Sie die Abfrage auf und führen Sie sie SQLplus aus. – Rene

+0

ok @Rene, Wenn ich diese Abfrage herausnehmen, ist die Fehlermeldung: 'ORA-00933: SQL-Befehl nicht ordnungsgemäß beendet bin ich falsch? –