2016-04-11 21 views
1

ben hata ayıklama ve bu prosedürde execute immediate üzerinde adım zaman, execute immediate kullanarak bir prosedür oluşturulmuş, aşağıdaki mesajı gösterir:UPDATE ve CONNECT BY destekleniyor mu?

Bir Oracle istisna kodunuzda oluştu. Kod bir istisna işleyici içeriyorsa, işleyiciye adım atmaya devam edebilirsiniz; aksi halde, hata mesajı görüntülenir ve bir sonraki adım yürütmeden çıkar. Ben sorguyu çıkarıp

sonra, sorgu içinde hemen yürütme geçerli:

:

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

ve G/çalıştırması sorgu derlemeye deneyin, böyle bir hata var

ORA-00933: SQL komutu düzgün

connect by priorile desteklenir mi erdi değil?

Bu benim yordamımdır ve update mstarea'un execute immediate ulaştığı zamanki hatanın altındadır.

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; 

Bunu düzeltmek için ne yapmalıyım?

+0

Sorumu düzeltmek için teşekkürler @Jonny –

+1

'' önceki 'ile bağlan' update' ile destekleniyor mu? - hayır değil: https://docs.oracle.com/database/121/SQLRF/statements_10008.htm#SQLRF01708 –

+0

@a_horse_with_no_name bilgi için teşekkürler efendim! –

cevap

1

kod sadece bu bölümünü büyütmek:

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; 

Sorgunuzda dört değişkenler var. Her ikisi de aynı ada sahip olsa da, her pozisyon için bir değer sağlamak zorunda. İki kez bu kullanım pnewarea1 düzeltmek için:

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

- Düzenleme ----

Sonuç update .. connect by prior Oracle desteklenmez olmasıdır.

+0

oh, tamam, @Rene tavsiyesi için teşekkürler, bu parametreyi ekledim ama yine de aynı hatayı aldım. bu açıklamadan mı? ya da başka birşey? –

+0

Gerçek hata olmadan cevap vermek zordur. Sorguyu toplayın ve SQLplus'ta çalıştırın. – Rene

+0

tamam @Rene, Bu sorguyu çıkardığımda hata iletisi: 'ORA-00933: SQL komutu düzgün şekilde sonlandırılmadı Yanlış mıyım? –

İlgili konular