2017-12-08 20 views
1

begin節の後にプロシージャで書き込むことを試みている以下のクエリがあります。私はいくつかの依存関係のためカーソルとして使用したくない。forループ内の変数にDBリンクを使用する方法

私はdbリンクをハードコーディングするのではなく、動的にしたいので、私はforループ全体を変数に入れます。変数を取り除くと、私の手続きは正常に動作しています。私はdblinkを動的にしようとしている間、自分のコードのロジックを変更したくない。次のいずれかを期待する場合、ループのこの部分が動作して

出会いファイルのシンボル・エンドとしてエラーを投げていない

しかし:

PROCEDURE TMP_CHECK 
IS 

open CS for NESS_QUERY; 
loop 
fetch CS into REC; 
exit when CS%notfound; 

INSERT INTO TMP_Data(ID,NAME,ID_TST,CHK_DATE,VALUE,CHECK,SOURCE) VALUES 
(IN_SEQ_NO,DB_NAME,DB_ID,REC.DAY_ID,REC.nb_ord,'ORDS','LEOSOFT'); 


COMMIT; 
END LOOP; 
CLOSE CS; 

END LOOP; 

END; 
+0

その断片からは分かりにくいですが、 ':='の代りに '='のようなものと、異なるエラーを投げ出すセミコロンがないと助けになりません。完全なエラースタックと共に、[MCVE](https://stackoverflow.com/help/mcve)が役に立ちます。変数からカーソルループを開くことはできますが、実際にどのように表示したかはわかりませんが、実際のコードではそのことがわかりません。 –

+0

実際に私はこのループからselectクエリを分離することができ、forループ内でそれを使用したいが、その重複データを生成する – Andrew

答えて

3

動的SQLは難しいですこれはコンパイルエラーをランタイムエラーに変換するためです。あなたのクエリにはいくつかのコンパイルエラーがあるように見えます:重複テーブルエイリアス、スコープ外エイリアス参照、リモートテーブル間のクロス結合(それが意図的な場合を除き、yuck!)最初に行うことは、クエリを直接SQLとして実行し、次にそれを動的にすることです。

また、テンプレートSQLにコメント付きコードを含めないでください。物事はすでに十分に難しいですが、なぜこのようなことをすることによってそれらをさらに困難にするのでしょうか?

ORDER BY 
-- TE.market asc, 
-- TE.entity asc, 
TE.dayiid ASC)' 

これで、あなたがしようとしていることの論理を見てみましょう。 PL/SQLの動的セグメントをプログラムにドロップすることはできません。これは機能しません。

LQUERY=' 
    FOR REC IN( 
    SELECT 

...完全なPL/SQL文を記述していないためです。しかし、あなたが望むことを実行する方法があります:カーソル変数を使用します。静的クエリと動的クエリに対しては、参照カーソルを開くことができます。 Find out more

以下は説明のためのものです。ビジネスロジックについて説明していないため、必ずしもこれを実行する最善の方法ではありません。

fetch CS into REC; 
:私はあなたの問題は、このだと思う

declare 
    .... 
    l_order number; 
    l_dayiid number; 
    l_ety_id number; 
    rc sys_refcursor; 
begin 
    ... 
    FOR IIS_DB IN C_DB 
    LOOP 
     IN_DB_LINK:=LEO_DB.DATABASE_LINK; 
     IN_DAY:=LEO_DB.DAY_ID; 
    open rc for 
     'SELECT order,dayiid,ety_id 
     from ... 
     ORDER BY TE.dayiid ASC)'; 
    loop 
     fetch rc into l_order, l_dayiid, l_ety_id; 
     exit when rc%notfound; 
     ... 
    end loop; 
    close rc; 

"変数 'REC' への不正な参照PLS-00487:" しかし、それはあなたの当面の問題を解決する必要があります

RECを文字列として定義しましたが、明らかにレコードタイプである必要があります。これはtの投影と一致する必要があります彼はあなたがフェッチしていることを問い合わせます。したがって、次のように定義する必要があります。

Type rec_t is record (
    nb_ord number, 
    day_id number, 
    entity number 
); 
REC rec_t; 

これでRECにレコードをフェッチし、その属性を参照できます。

ちなみにNB_ORDを提供するように書いたnvl()は間違っています。最初の引数はnullをテストするものです:500はnullになることはありませんので、すべての行に対して取得することになります。あなたは、パラメータをスワップする必要があります。

+0

あなたの返事に感謝します。ここでは1つの質問だけ。 exit文の後にreferance変数を使用してデータをテーブルに挿入する方法と、それをどのように使用することができますか? For.eg INSERTからTEST_VAL(order、dayiid、ety_id)までの値(rec.l_order、ref.dayiid、rc.ety_id); – Andrew

+0

ありがとう私は私の質問を更新し、完全なストアprocedure.Iを言いましたあなたのロジックを使用していますが、エラー(108,58)として終了ステートメントの後にINSERTステートメントを使用した行にエラーが発生しました:PLS-00487: REC '、エラー(108,62):PL/SQL:ORA-00984:ここでは列が許可されていません – Andrew

+0

質問に記載されている情報を見つけましたか?ありがとう。 – Andrew

関連する問題