2016-12-29 12 views
0

特定の日付に基づいてテーブルから〜700行を更新するプロシージャがあります。 プロシージャが何らかの理由でクラッシュして、プロシージャを開始した場所から開始するのではなく、始まりのステートメントからではなく(たとえば、行214に移動して)、プロシージャを再起動するとします。oracle plsqlの動的なgoto

私はこのような何かしよう:それが動作

begin 

goto &label; 

<N1>; 

dbms_output.put_line(1); 

<N2>; 

dbms_output.put_line(2); 

end; 

を、それは人間の相互作用を推定します、と私は手順が自動的にこれをしたいと思います。

アンパサンド(&)がないと、どうすればいいですか? ラベルを変数として宣言すると、ラベルが機能しないか、ラベルを変数として使用する方法がわかりません。

+0

論理を変更することを検討してください。 PL/SQLブロックは、実行時に人間と直接対話することを意味しません。 プロシージャは再実行できるように、別々の「論理ユニット」を持つ必要があります。 –

+0

更新ステータス用の特殊テーブルを作成します。 lablesの代わりに、ロジックをif-then文にラップして、update-statusをチェックします。ステップの後にステータスを更新してコミットします。次のステップではステータスの更新が表示され、正常に実行されます。再実行すると最初にN個のステップはスキップされます。間違ってコミットされた場合は手動で対話する必要があります。この場合、テーブルの更新ステータスをリセット/変更する必要があります。 –

+0

質問はあなたが動的に行くことができる方法についてです、私は知っていますが、私はどのように変数がラベルを宣言することができますどのように問題があるか分からない。 – Iulian

答えて

2

静的PL/SQLブロックで「動的GOTO」を実行することはできません。理由は、GOTOキーワードに続く引数は、ジャンプ先のラベルとして解釈され、ラベルに評価される式として解釈されないためです。あなたが買ってあげる最も近いについて

はこれです:あなたは、静的なPL/SQLでこれを行うことはできませんが

declare 
    l_label VARCHAR2(30) := 'N2'; 
BEGIN 

CASE l_label 
    WHEN 'N1' THEN GOTO N1; 
    WHEN 'N2' THEN GOTO N2; 
    ELSE raise_application_error (-20001, 'Unknown label: ' || l_label); 
END CASE; 

<<N1>> 
    DBMS_OUTPUT.put_line (1); 

<<N2>> 
    DBMS_OUTPUT.put_line (2); 
END; 
+1

ちなみに、あなたのプロセスの詳細は分かりませんが、700行が更新されているので、再起動の心配ではなく、エラーが発生した場合にはすべてを「ロールバック」することを真剣に検討します。 –

+0

テーブルは、互いに独立したさまざまな情報を持つダッシュボードです。したがって、私はすでに計算したものを保つことを好みます。 – Iulian

0

、アンパサンド(&)のご利用には、SQL * Plusを使用して、単にかもしれないことを意味し人間が実行時にラベルの値を入力しなければならないことを避けたい。

SQL * Plusでは、これを行うことができます。

column label_value old_value label; 
set termout off 
REM Replace the following SQL with something that will get the correct label. 
select 'N2' label_value FROM dual; 
set termout on 
set verify off 

set serveroutput on 

begin 
    goto &label; 
    <<N1>> 
    dbms_output.put_line('N1'); 
    <<N2>> 
    dbms_output.put_line('N2'); 
end; 
/
+0

実際の問題は、どのようにアンパサンド(&)を取り除くことができるかということでした。 – Iulian

+0

'select 'N2' label_value FROM dual'はジャンプしたいラベルを'&label'変数にロードします。あなたの質問に言及したように、人間とのやり取りは必要ありません。 –

+0

アンパサンド変数に_valueを選択することはできません(試してみました)。label_valueでは変数label_valueを宣言します。ラベル(varchar2として宣言されています)は値を依頼します。たぶん、このようなものですが、構文が違うかもしれません。 – Iulian

関連する問題