2017-07-03 19 views
1

カーソルが宣言されたとき、それは静的なデータセットですか、または新しいデータがループを開始する前に入力されたかどうかを宣言した後に、ループのためにピックアップされますか?P1-SQLカーソルに格納されたデータは動的か静的ですか?

+0

私たちは 'OPEN cursor_nameは呼び出す前に、データがコミットされた場合を考える;'、それはあまりにもそのデータをピックアップします。 –

+0

カーソルは単にスペースを割り当てます。データセットはありません。これには、開いたクエリのデータセットが含まれています。 – XING

+0

実行時にデータが正しく取得されるようにしますか?つまり、新しいデータがカーソルを開く時間枠に含まれ、カーソルを宣言すると、新しい行 –

答えて

2

カーソルを宣言すると、名前と関連するSELECTステートメントでカーソルが定義されます。カーソルを宣言した後、カーソルをオープンしてカーソル用のメモリーを割り振り、SQLステートメントによって戻された行をその中に取り込む準備ができている必要があります。たとえば、次のようにカーソル CURSORのc_customersを宣言

  1. は、ID、名前、顧客からのアドレスを選択 されます。

  2. カーソルを開く OPEN c_customers;

  3. 開いた後、カーソルをフェッチすることで、一度に1行にアクセスできます。 FETCH c_customers INTO c_id、c_name、c_addr;

  4. カーソルをフェッチした後、カーソルを閉じるだけです。 閉じるc_customers;

したがって、ループでは取り上げられません。

+0

修正すると、後で "実行するもの"の "定義"としてカーソルが表示されます。カーソルを開いた瞬間は、データセットが有効な正確な時刻です。あなたは好きなだけカーソルから読み続けることができます。それが返すデータは、常にあなたの開始時刻の状況を表します。他のセッションでデータが変更され、あなたが長時間待機すると、SNAPSHOT TO OLDエラーが発生する可能性があります。このようにしてください:オープン時には、現在の状況のスナップショットが必要です。このスナップショットは、カーソルを閉じるまで有効です。他のセッションでのデータ変更はあなたには見えません。 – hetOrakel

+0

真の場合、データの変更は不可視です。 –

1

オラクル社ではStatement-Level Read Consistencyを提供しています。これにより、単一の問合せで戻されたデータがコミットされ、問合せの開始時に一貫性が保証されます。

トランザクション分離レベル、フラッシュバック・クエリ、および問合せを実行するユーザー定義関数にはいくつかの詳細がありますが、一般に問合せが開始されると(手順的にはカーソルがオープンされると)結果は真となりますその時点では、データの変更(コミットされたかどうか)にかかわらず。

1

私はmysqlを試していますが、mysqlはデータを取得しています。
新しいテーブルを作成し、プロシージャを作成しました。このプロシージャは、新しく作成された空の表に2つのレコードを挿入して、カーソルを開いてを変数record_cntに選択します。
FOUND_ROWS()は、カーソルによってフェッチされた行の数を示します。オラクルではcursor_name%ROWCOUNTです。
オラクルでは、構文上の相違点は間違いありませんが、カーソルを開く前に動作が同じで、カーソルが挿入されてコミットされていると値がカーソルに表示されると思います。

CREATE TABLE my_tab(id int); 

DELIMITER $$ 
CREATE PROCEDURE cursor_test(OUT record_cnt INT) 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE cur1 CURSOR FOR SELECT * FROM my_tab; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    INSERT INTO my_tab VALUES(1),(2); 
    COMMIT; 
    OPEN cur1; 
    SELECT FOUND_ROWS() INTO record_cnt; 
    CLOSE cur1; 
END$$ 
DELIMITER ; 

CALL cursor_test(@rec); 

select @rec; 
+------+ 
| @rec | 
+------+ 
| 2 | 
+------+ 
+0

私のシナリオは、カーソルを開いた後selectステートメントの前にテーブルにレコードを入力したときです。同じセッションまたは別のセッションのいずれか –

+0

その場合は利用できません。 –

関連する問題