ngtokuの日記

主に雑記帳です。SNSではngtokuのID取れなかったんで、別のIDでやってます。

Stored Functionの結果を表形式で取得

時々忘れるのでメモ的に。

  • パッケージ宣言は以下
/* パッケージ宣言 */
CREATE OR REPLACE PACKAGE PACKAGE_AAA AS

	TYPE BRANCH_RESULT IS RECORD(
		SUM_ROW_FLG		CHAR(1) := '0',							/* 集計行フラグ。集計行 = 1 */
		BRANCH_NAME		TABLE.BRANCH_NAME%TYPE,	/* 店舗名     */
		SUM						TABLE.SUM%TYPE := 0				/*  小計      */
	);

	/* 構造体の配列。これがFUNC_AAA戻りの型 */
	TYPE BRANCH_RESULT_TBL IS TABLE OF BRANCH_RESULT;

	/* BRANCH_RESULTを定義して初期値をセットする */
	FUNCTION CREATEBRANCH_RESULT(
		DUMMY IN NUMBER
	) RETURN BRANCH_RESULT;

	/* 関数 */
	FUNCTION FUNC_AAA(
		P_AAA	IN ZZZ.AAA%TYPE ,
		P_BBB	IN ZZZ.BBBYPE,
		P_CCC	IN ZZZ.CCC%TYPE
	);
END PACKAGE_AAA;
/
SHOW ERRORS

/* パッケージ BODY */
CREATE OR REPLACE PACKAGE BODY PACKAGE_AAA AS

	FUNCTION CREATEBRANCH_RESULT(
		DUMMY IN NUMBER
	) RETURN BRANCH_RESULT
	IS
		/* BEGIN以下ではデフォルト値が設定されないようなので、ここで宣言 */
		BRANCH BRANCH_RESULT;
	BEGIN
		RETURN BRANCH;
	END CREATEBRANCH_RESULT;

	FUNCTION FUNC_AAA (
		P_AAA	IN ZZZ.AAA%TYPE ,
		P_BBB	IN ZZZ.BBBYPE,
		P_CCC	IN ZZZ.CCC%TYPE
	) RETURN BRANCH_RESULT_TBL PIPELINED
	IS
		/*店舗一覧取得SQL*/
		CURSOR CUR1 IS
			SELECT  BRANCH_NAME, SUM
			FROM BBB
			WHERE  CCC;
			
		RESULT BRANCH_RESULT;
	BEGIN
		FOR REC IN CUR1
			LOOP
				RESULT := CREATEBRANCH_RESULT(0);
				RESULT.BRANCH_NAME := REC.BRANCH_NAME;
				RESULT.SUM = REC.SUM;
				/* 出力 */
				PIPE ROW(RESULT);
			END LOOP;

	END FUNC_AAA;

END PACKAGE_AAA;
/
SHOW ERRORS
  • 取得するsqlは以下
SELECT * FROM TABLE(PACKAGE_AAA.FUNC_AAA(:P_AAA, :P_BBB, :P_CCC))