三流備忘録OracleのSQL PL/SQL 関数 ついての備忘録
ホーム >> PL/SQL備忘録 >> カーソルの基本

カーソルの基本

カーソル属性

カーソル属性内容
カーソル名%NOTFOUND;フェッチ行がなければTRUE
カーソル名%FOUND; フェッチ行があればTRUE
カーソル名%ROWCOUNT;フェッチされた行数
カーソル名%ISOPEN;オープンしていればTRUE

カーソル例

DECRARE
	
	/*****************************************************************
		CURSOR カーソル名 IS SELECT 文;
	/*****************************************************************
	CURSOR CSR1 IS
		SELECT hoge_id,hoge_seq,hoge_name
		FROM   T_HOGE
		WHERE  hoge_id BETWEEN 1 AND 10;
		
	CSR1_REC CSR1%ROWTYPE;--レコード変数宣言
BIGIN
	
	/*****************************************************************
		OPEN カーソル名;
	/*****************************************************************
	OPEN CSR1;
	
	LOOP
		
		/*****************************************************************
			FETCH カーソル名 INTO レコード;
		/*****************************************************************
		FETCH CSR1 INTO CSR1_REC;

		EXIT WHEN CSR1%NOTFOUND;

		DBMS_OUTPUT.PUT_LINE('hoge_id=' || CSR1.hoge_id);
		DBMS_OUTPUT.PUT_LINE('hoge_seq=' || CSR1.hoge_seq);
		DBMS_OUTPUT.PUT_LINE('hoge_name=' || CSR1.hoge_name);

	END LOOP;

	
	/*****************************************************************
		CLOSE カーソル名;
	/*****************************************************************
	CLOSE CSR1;
END;

カーソル例(FOR..IN)

DECRARE
	
	/*****************************************************************
		CURSOR カーソル名 IS SELECT 文;
	/*****************************************************************
	CURSOR CSR1 IS
		SELECT hoge_id,hoge_seq,hoge_name
		FROM   T_HOGE
		WHERE  hoge_id BETWEEN 1 AND 10;
		
BIGIN
	
	/*****************************************************************
	・カーソルのOPEN,FETCH,EXIIT,CLOSEを簡易かした方法
	・レコード変数を事前に宣言する必要がない
	・CSR1の部分にSELECT文を書ける。
	/*****************************************************************
	
	FOR CSR1_REC IN CSR1 LOOP
		
		DBMS_OUTPUT.PUT_LINE('hoge_id=' || CSR1.hoge_id);
		DBMS_OUTPUT.PUT_LINE('hoge_seq=' || CSR1.hoge_seq);
		DBMS_OUTPUT.PUT_LINE('hoge_name=' || CSR1.hoge_name);

	END LOOP;


END;

カーソル例(パラメータ付)

DECRARE
	
	/*****************************************************************
		CURSOR カーソル名 IS SELECT 文;
	/*****************************************************************
	CURSOR CSR1(KEY1 NUMBER,KEY2 NUMBER) IS
		SELECT hoge_id,hoge_seq,hoge_name
		FROM   T_HOGE
		WHERE  hoge_id BETWEEN KEY1 AND KEY2;
		
BIGIN
	
	/*****************************************************************
	・パラメータを指定
	/*****************************************************************
	FOR CSR1_REC IN CSR1( 1 , 5) LOOP
		
		DBMS_OUTPUT.PUT_LINE('hoge_id=' || CSR1.hoge_id);
		DBMS_OUTPUT.PUT_LINE('hoge_seq=' || CSR1.hoge_seq);
		DBMS_OUTPUT.PUT_LINE('hoge_name=' || CSR1.hoge_name);

	END LOOP;

END;