2016-04-11 16 views
1

は私がデバッグすると、この手順でexecute immediateにステップオーバーする場合、execute immediateを使用してプロシージャを作成し、それは次のようなメッセージが表示されます。UPDATEとCONNECT BYはサポートされていますか?

Oracleの例外は、あなたのコード内で発生しています。コードに例外ハンドラが含まれている場合は、引き続きハンドラをステップ実行することができます。そうしないと、エラーメッセージが表示され、次のステップは実行を終了します。

と、私は、クエリを取り出した後、すぐに実行中のクエリは次のとおりです。

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

と私はそのクエリをコンパイル/実行しようと、それはこのようなエラーがあります:

ORA-00933:SQLコマンドが正常に

connect by priorがでサポートされて終了していません?

これは私の手続きであり、execute immediateに達したときのエラーはupdate mstarea以下です。

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; 

これを解決するにはどうすればよいですか?

+0

私の質問を編集していただきありがとうございます@Jonny –

+1

'connect by prior'は' update'でサポートされていますか? - そうではありません:https://docs.oracle.com/database/121/SQLRF/statements_10008.htm#SQLRF01708 –

+0

@a_horse_with_no_name情報ありがとうございました! –

答えて

1

コードのちょうどこの部分にズームイン:

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; 

はあなたのクエリ内の4つの変数を持っています。それらのうちの2つは同じ名前を持っていますが、あなたはそれぞれの位置に値を与えなければなりません。二回この使用pnewarea1を修正するには、次の

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

- 編集----

結論がupdate .. connect by priorは、Oracleでサポートされていないことです。

+0

ああ、ありがとう、アドバイス@ルネありがとう、私はそのパラメータを追加しましたが、まだ同じエラーがあった。 それは声明からですか?か何か? –

+0

実際のエラーがなければ、答えるのは難しいです。クエリを受け取り、それをSQLplusで実行します。 – Rene

+0

OK @Rene、 私は、そのクエリを取り出したときに、エラーメッセージは次のとおりです。 'ORA-00933:SQLコマンドが正常に は私が間違っているended'ありませんか? –

関連する問題