2017-01-02 11 views
1

Oracle SQLを使用して結果セットを2回ループする際に問題があります。カーソルを使用して変数に結果セットを保存する

問題

私は与えられたテーブル名に私のすべての外部キーを取得し、カーソルを持っています。このカーソルから結果を使用して、すべての制約をループして無効にします。次にデータのインポートを実行し、同じ結果セットをループして有効にする必要があります。私は

私の脳は、変数に直接ジャンプしたいと思っ何

CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
    SELECT table_name,constraint_name, status 
    FROM user_constraints 
    WHERE (r_constraint_name,r_owner) IN 
    (SELECT constraint_name, owner 
    FROM user_constraints 
    WHERE owner ='POP' 
    AND table_name=upper(tabellnavn) 
) 
    AND STATUS = 'ENABLED'; 

。私はカーソルを1回だけ実行し、その結果をカーソルから変数に保存したいと考えています。

これは可能ですか、またはカーソルとループの結果を2回保存するために何かしていますか?

答えて

2

このコードを試してください。制約のテーブル名だけを表示するようにコードを修正しました。必要に応じて、plsqlの最後の部分を変更することができます。あなたが間違いや問題を遭遇した場合は、ご意見ください、ありがとうございます。

CREATE or replace PROCEDURE a_proc(name_table varchar) 
AS 
CURSOR c_fkeys_inn(tabellnavn IN VARCHAR2) 
IS 
SELECT table_name,constraint_name, status 
FROM user_constraints 
WHERE STATUS = 'ENABLED' 
AND TABLE_NAME=tabellnavn; 

names_t c_fkeys_inn%ROWTYPE; 
TYPE c_fkeys IS TABLE OF names_t%TYPE; 
fkeys c_fkeys; 
BEGIN 
OPEN c_fkeys_inn(name_table); 
FETCH c_fkeys_inn BULK COLLECT INTO fkeys; 
CLOSE c_fkeys_inn; 

FOR indx IN 1..fkeys.COUNT LOOP 
DBMS_OUTPUT.PUT_LINE(fkeys(indx).table_name); 
END LOOP; 
END a_proc; 

コードを実行するには、別のplsqlブロックを実行してください。下記のシンプルでサンプルのplsqlブロックを見つけてください。

begin 
a_proc('SUPPLIER'); 
END; 
+0

はい。これは正常に動作します。変数の作成方法を説明してもらえますか? – Stene

+1

上記のカーソルに対応するタイプのテーブルを作成する必要があります。いったんタイプUを作成すると、一度にすべてのカーソルレコードをタイプに格納する必要があります。バルク収集を使用して達成できます。 Bulk collectはすべての行を取り出し、コレクションにロードしてPL/SQLエンジンに戻します。すべての行が格納されたら、ループの概念を使用して型内をトラバースし、必要な操作を表示または実行できます。遅く返事をして申し訳ありません(時間のずれのため:) –

関連する問題