2

を使用してプロシージャを作成しました。execute immediateデバッグしexecute immediateてこのプロシージャにステップオーバーすると、次のメッセージが表示されます。

コードで 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でサポートされていupdateますか?

これが私の手順で、 にupdate mstareaなった時のエラーは以下execute immediateです。

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;

これを修正するにはどうすればよいですか?

4

1 に答える 1

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 を 2 回使用します。

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

- 編集 - -

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

于 2016-04-11T07:52:03.657 に答える