PL/SQL : リアルサンプル1


  SAMPLE01




CREATE or REPLACE PROCEDURE SAMPLE01
        (
         PM_BLOCKSHO	IN      NUMBER
        ,PM_DATE	IN      DATE
        )
        AS

/*===========================================================================
   変数
===========================================================================*/
	source_cursor		integer;
	destination_cursor	integer;
	rows_processed		integer;

	WK_DATE			DATE;
	WK_SELECT	VARCHAR2(1024);			-- select 文
	WK_INSERT	VARCHAR2(1024);			-- insert 文

	売上通常		NUMBER(10,0);		-- (E) 1
	売上通常消費税		NUMBER(10,0);		-- (F) 1
	売上中間請求		NUMBER(10,0);		-- (A) 2
	売上中間請求消費税	NUMBER(10,0);		-- (B) 2
	売上最終請求		NUMBER(10,0);		-- (I) 3
	売上最終請求消費税	NUMBER(10,0);		-- (J) 3
	売上値引		NUMBER(10,0);		-- (C) 4
	売上値引消費税		NUMBER(10,0);		-- (D) 4
	売上修正		NUMBER(10,0);		-- (G) 5
	売上修正消費税		NUMBER(10,0);		-- (H) 5

	ブロック小コード		NUMBER(4,0);
	取引先コード		NUMBER(5,0);
	取引先支店コード		NUMBER(2,0);
	ソート区分			NUMBER(1,0);
	金額			NUMBER(10,0);
	消費税			NUMBER(10,0);

	SVブロック小コード		NUMBER(4,0);
	SV取引先コード		NUMBER(5,0);
	SV取引先支店コード	NUMBER(2,0);

	事業部			NUMBER(2,0);
	部			NUMBER(1,0);
	課			NUMBER(1,0);
	前月請求額		NUMBER(10,0);
	入金金額		NUMBER(10,0);

	最新請求年月日		DATE;

/*===========================================================================
   カーソル
===========================================================================*/

/*===========================================================================
   ローカル関数
===========================================================================*/
/*=======================================================
   最新請求締年月日取得
   IN           PM_DATE         : 締年月日
   RETURN       WK_DATE         : 最新請求締年月日
=====================================================*/
FUNCTION GET_DATE_SIME (PM_DATE IN DATE) RETURN DATE
        AS
        WK_DATE         DATE;
BEGIN
        WK_DATE         := ADD_MONTHS(PM_DATE,-1);
        WK_DATE         := WK_DATE + 1;
        RETURN          WK_DATE;
END GET_DATE_SIME;

/*=======================================================
   請求明細テーブル名取得
   IN		PM_DATE         : 締年月日
   RETURN	WK_TBLNAME      : 目的テーブル名
=====================================================*/
FUNCTION GET_SEIDT_NAME (PM_DATE IN DATE) RETURN VARCHAR2
	AS
	WK_DATE         DATE;
        WK_DAY          VARCHAR2(30);
        WK_TBLNAME	VARCHAR2(30);
BEGIN
        WK_DATE := LAST_DAY(PM_DATE);
        if WK_DATE = PM_DATE then
                WK_TBLNAME := 'KF_SEIDT99';
        else
                WK_DAY := TO_CHAR( PM_DATE, 'DD' );
                WK_TBLNAME := 'KF_SEIDT' || WK_DAY;
        end if;
	RETURN	WK_TBLNAME;
dbms_output.put_line( WK_TBLNAME );
END GET_SEIDT_NAME;


/*=======================================================
   長い文字列出力
=====================================================*/
PROCEDURE PUT_LSTR (PM_STR IN VARCHAR2)
        AS
BEGIN
	DBMS_OUTPUT.PUT_LINE(substr(PM_STR,1,80));
	DBMS_OUTPUT.PUT_LINE(substr(PM_STR,81,80));
	DBMS_OUTPUT.PUT_LINE(substr(PM_STR,161,80));
	DBMS_OUTPUT.PUT_LINE(substr(PM_STR,241,80));
	DBMS_OUTPUT.PUT_LINE(substr(PM_STR,321,80));
	DBMS_OUTPUT.PUT_LINE(substr(PM_STR,401,80));
	DBMS_OUTPUT.PUT_LINE(substr(PM_STR,481,80));
END PUT_LSTR;

/*=======================================================
   請求ファイルの前レコード当月請求額を取得
=====================================================*/
FUNCTION GET_BACK_SEIKYU
	(
	PM_BLOCKSHO IN NUMBER
	,PM_TORI IN NUMBER
	,PM_TORI_ST IN NUMBER
	)
	RETURN NUMBER
        AS
	WK_KINGAKU	NUMBER(10,0);
        CURSOR KF_SEI_cur is 
                select
                        KIN_TOSEI
                from
                        KF_SEI
		where
			CD_BLOCKSHO = PM_BLOCKSHO and
			CD_TORI = PM_TORI and
			CD_TORI_ST = PM_TORI_ST
		order by 
			YMD_SIME_SEI DESC;

BEGIN
	BEGIN
	        OPEN    KF_SEI_cur;
        	FETCH	KF_SEI_cur	INTO	WK_KINGAKU;
		if KF_SEI_cur%NOTFOUND then
			WK_KINGAKU := 0;
		end if;

	EXCEPTION
	        WHEN OTHERS THEN
			WK_KINGAKU := 0;

	END;	

	RETURN WK_KINGAKU;
END GET_BACK_SEIKYU;

/*=======================================================
   回収Fより入金額を取得
=====================================================*/
FUNCTION GET_KAISYU
	(
	PM_BLOCKSHO IN NUMBER
	,PM_TORI IN NUMBER
	,PM_TORI_ST IN NUMBER
	)
	RETURN NUMBER
        AS
	WK_KINGAKU1	NUMBER(10,0);
	WK_KINGAKU2	NUMBER(10,0);
	WK_NYUKIN	NUMBER(10,0);
BEGIN

	WK_KINGAKU1 := 0;
	WK_KINGAKU2 := 0;

	select
		nvl(sum(KIN_KAI),0)
	into
		WK_KINGAKU1
	from
		KF_TOKU_KAI
	where
		CD_BLOCKSHO = PM_BLOCKSHO and
		CD_TORI	= PM_TORI and
		CD_TORI_ST = PM_TORI_ST and
		NO_KIN = 1 and
		NO_SYU not in (23,26) and
		KIN_KAI is not NULL;

	select
		nvl(sum(KIN_KAI),0)
	into
		WK_KINGAKU2
	from
		KF_TOKU_KAI
	where
		CD_BLOCKSHO = PM_BLOCKSHO and
		CD_TORI	= PM_TORI and
		CD_TORI_ST = PM_TORI_ST and
		NO_KIN = 2 and
		NO_SYU not in (23,26) and
		YMD_KAI between WK_DATE and PM_DATE and
		KIN_KAI is not NULL;

	WK_NYUKIN := WK_KINGAKU1 - WK_KINGAKU2;

	RETURN WK_NYUKIN;

END GET_KAISYU;

/*=====================================================
   取引サブMより部門コードを取得して
   最新請求締年月日を更新し、
   請求締日変更ファイルより該当レコードを削除する
=====================================================*/
PROCEDURE GET_TORISUB
        (
         PM_BLOCKSHO	IN      NUMBER
        ,PM_TORI        IN      NUMBER
        ,PM_TORI_ST	IN	NUMBER
        ,PM_DATE	IN	DATE
        ,PM_JIGYO	IN OUT  NUMBER
        ,PM_BUMON	IN OUT  NUMBER
        ,PM_KA		IN OUT  NUMBER
        )
        AS

	WK_KBN_JITA	NUMBER(1,0);
	WK_SIME		DATE;
BEGIN
	BEGIN
		select					-- 取引サブMより部門コードを取得
			CD_JIGYO,
			CD_BUMON,
			CD_KA,
			YMD_SEI_NEW
		into
			PM_JIGYO,
			PM_BUMON,
			PM_KA,
			最新請求年月日
		from
			MM_TORISUB
		where
			CD_TORI = PM_TORI and
			CD_TORI_ST = PM_TORI_ST;

		if	最新請求年月日 is NULL then
		        WK_DATE         := ADD_MONTHS(PM_DATE,-1);
        		WK_DATE         := WK_DATE + 1;
		else
        		WK_DATE         := 最新請求年月日 + 1;
		end if;

--		update
--			MM_TORISUB
--		set
--			YMD_SEI_NEW = PM_DATE
--		where
--			CD_TORI = PM_TORI and
--			CD_TORI_ST = PM_TORI_ST;

		select
			KBN_JITA
		into	
			WK_KBN_JITA
		from
			MM_TORI
		where
			CD_TORI	= PM_TORI and
			CD_TORI_ST = PM_TORI_ST;

		if	WK_KBN_JITA = 0 then
                        BEGIN
				select
					YMD_HSIME_SEI
				into
					WK_SIME
				from
					KF_HSIME_SEI
				where
					CD_BLOCKSHO	= PM_BLOCKSHO and
					CD_TORI		= PM_TORI and
					CD_TORI_ST	= PM_TORI_ST;
			EXCEPTION
				WHEN NO_DATA_FOUND THEN NULL;
			END;
			if SQL%FOUND then
				if WK_SIME = PM_DATE then
					delete
					from
						KF_HSIME_SEI
					where
						CD_BLOCKSHO	= PM_BLOCKSHO and
						CD_TORI		= PM_TORI and
						CD_TORI_ST	= PM_TORI_ST;
				end if;
			end if;
		end if;

        EXCEPTION
                WHEN NO_DATA_FOUND THEN
                        PM_JIGYO := NULL;             
                        PM_BUMON := NULL;             
                        PM_KA := NULL;             
		        WK_DATE         := ADD_MONTHS(PM_DATE,-1);
        		WK_DATE         := WK_DATE + 1;
                WHEN OTHERS THEN
                        PM_JIGYO := NULL;             
                        PM_BUMON := NULL;             
                        PM_KA := NULL;             
		        WK_DATE         := ADD_MONTHS(PM_DATE,-1);
        		WK_DATE         := WK_DATE + 1;
        END;

END GET_TORISUB;

/*===========================================================================
   単純サブルーチン
===========================================================================*/
/*=====================================================
   ワーク変数の初期化
=====================================================*/
PROCEDURE ZERO_CLEAR
	AS
BEGIN

	売上通常		:= 0;
	売上通常消費税		:= 0;
	売上中間請求		:= 0;
	売上中間請求消費税	:= 0;	
	売上最終請求		:= 0;
	売上最終請求消費税	:= 0;
	売上値引		:= 0;
	売上値引消費税		:= 0;
	売上修正		:= 0;
	売上修正消費税		:= 0;

END ZERO_CLEAR;

/*=====================================================
   データの登録
=====================================================*/
PROCEDURE INSERT_DATA
	AS
BEGIN

	dbms_sql.bind_variable(destination_cursor, 'CD_BLOCKSHO', PM_BLOCKSHO);
	GET_TORISUB(PM_BLOCKSHO,SV取引先コード,SV取引先支店コード,PM_DATE,事業部,部,課);
	dbms_sql.bind_variable(destination_cursor, 'CD_JIGYO', 事業部);
	dbms_sql.bind_variable(destination_cursor, 'CD_BUMON', 部);
	dbms_sql.bind_variable(destination_cursor, 'CD_KA', 課);
	dbms_sql.bind_variable(destination_cursor, 'CD_TORI', SV取引先コード);
	dbms_sql.bind_variable(destination_cursor, 'CD_TORI_ST', SV取引先支店コード);
	dbms_sql.bind_variable(destination_cursor, 'YMD_FROM_SEI', WK_DATE);
	dbms_sql.bind_variable(destination_cursor, 'YMD_SIME_SEI', PM_DATE);
	前月請求額 := GET_BACK_SEIKYU(SVブロック小コード,SV取引先コード,SV取引先支店コード);
	dbms_sql.bind_variable(destination_cursor, 'KIN_ZENSEI', 前月請求額);
	入金金額 := GET_KAISYU(SVブロック小コード,SV取引先コード,SV取引先支店コード);
	dbms_sql.bind_variable(destination_cursor, 'KIN_NYUKIN', 入金金額);
	dbms_sql.bind_variable(destination_cursor, 'KIN_ZENSYU', 売上修正+売上修正消費税);
	dbms_sql.bind_variable(destination_cursor, 'KIN_URIAGE', 売上通常+売上最終請求+売上値引);
	dbms_sql.bind_variable(destination_cursor, 'KIN_TYUKAN', 売上中間請求);
	dbms_sql.bind_variable(destination_cursor, 'ZEI_URIAGE', 売上中間請求消費税
		+売上値引消費税
		+売上通常消費税
		+売上最終請求消費税);
	dbms_sql.bind_variable(destination_cursor, 'KIN_TOSEI', 前月請求額
		-入金金額
		+売上通常+売上最終請求+売上値引
		+売上中間請求
		+売上中間請求消費税+売上値引消費税+売上通常消費税+売上最終請求消費税);

--	dbms_sql.bind_variable(destination_cursor, 'YMD_UPD', sysdate);

	rows_processed := dbms_sql.execute(destination_cursor);

END INSERT_DATA;

/*===========================================================================
   主処理
===========================================================================*/
BEGIN

/*=====================================================
   初期処理
=====================================================*/
--	WK_DATE	:= GET_DATE_SIME(PM_DATE);			-- 今回の締年月日よりfrom年月日を取得


/*=====================================================
   SELECT文作成(請求明細**読込用)
   金額と数量をサマリ
=====================================================*/


	WK_SELECT	:=
	'select 
		CD_BLOCKSHO,
		CD_TORI,
		CD_TORI_ST,
		sum(KIN_URIAGE),
		sum(ZEI_URIAGE),
		KBN_SORT
	from ' || GET_SEIDT_NAME(PM_DATE) || 
	' group by
		CD_BLOCKSHO,
		CD_TORI,
		CD_TORI_ST,
		KBN_SORT';
/*
	'select 
		CD_BLOCKSHO,
		CD_TORI,
		CD_TORI_ST,
		sum(KIN_URIAGE),
		sum(ZEI_URIAGE),
		KBN_SORT
	from ' || GET_SEIDT_NAME(PM_DATE) || 
	' where
		CD_BLOCKSHO = :PM_BLOCKSHO and
		YMD_URI_KJ between :WK_DATE and :PM_DATE
	group by
		CD_BLOCKSHO,
		CD_TORI,
		CD_TORI_ST,
		KBN_SORT';

*/

/*=====================================================
   入力定義
=====================================================*/
	source_cursor := dbms_sql.open_cursor;
	dbms_sql.parse(source_cursor, WK_SELECT, 2 );
	dbms_sql.define_column(source_cursor, 1, ブロック小コード);
	dbms_sql.define_column(source_cursor, 2, 取引先コード);
	dbms_sql.define_column(source_cursor, 3, 取引先支店コード);
	dbms_sql.define_column(source_cursor, 4, 金額);
	dbms_sql.define_column(source_cursor, 5, 消費税);
	dbms_sql.define_column(source_cursor, 6, ソート区分);

--	dbms_sql.bind_variable(source_cursor, 'PM_BLOCKSHO', PM_BLOCKSHO);
--	dbms_sql.bind_variable( source_cursor, 'WK_DATE', WK_DATE );
--	dbms_sql.bind_variable( source_cursor, 'PM_DATE', PM_DATE );

	rows_processed := dbms_sql.execute(source_cursor);


/*=====================================================
   出力定義(請求F)
=====================================================*/
	destination_cursor := dbms_sql.open_cursor;
	WK_INSERT	:=
	'insert into KF_SEI (
		CD_BLOCKSHO,
		CD_JIGYO,
		CD_BUMON,
		CD_KA,
		CD_TORI,
		CD_TORI_ST,
		YMD_FROM_SEI,
		YMD_SIME_SEI,
		KIN_ZENSEI,
		KIN_NYUKIN,
		KIN_ZENSYU,
		KIN_URIAGE,
		KIN_TYUKAN,
		ZEI_URIAGE,
		KIN_TOSEI
--		YMD_UPD
		)
	 values (
		:CD_BLOCKSHO,
		:CD_JIGYO,
		:CD_BUMON,
		:CD_KA,
		:CD_TORI,
		:CD_TORI_ST,
		:YMD_FROM_SEI,
		:YMD_SIME_SEI,
		:KIN_ZENSEI,
		:KIN_NYUKIN,
		:KIN_ZENSYU,
		:KIN_URIAGE,
		:KIN_TYUKAN,
		:ZEI_URIAGE,
		:KIN_TOSEI
--		:YMD_UPD
		)';

	dbms_sql.parse( destination_cursor, WK_INSERT, 2 );

	SVブロック小コード		:= -1;
	ZERO_CLEAR;


/*=====================================================
   入出力
=====================================================*/
	loop

		if dbms_sql.fetch_rows(source_cursor) > 0 then
			dbms_sql.column_value(source_cursor, 1, ブロック小コード);
			dbms_sql.column_value(source_cursor, 2, 取引先コード);
			dbms_sql.column_value(source_cursor, 3, 取引先支店コード);
			dbms_sql.column_value(source_cursor, 4, 金額);
			dbms_sql.column_value(source_cursor, 5, 消費税);
			dbms_sql.column_value(source_cursor, 6, ソート区分);
			DBMS_OUTPUT.PUT_LINE(
				'取引先コード:' || TO_CHAR(取引先コード) ||
				'  取引先支店コード:' || TO_CHAR(取引先支店コード) ||
				'  ソート区分:' || TO_CHAR(ソート区分) ||
				'  金額:' || TO_CHAR(金額) ||
				'  消費税:' || TO_CHAR(消費税)
			);


			if SVブロック小コード = -1 then
				NULL;
			else
				if	SVブロック小コード != ブロック小コード or
					SV取引先コード != 取引先コード or
					SV取引先支店コード != 取引先支店コード then

					BEGIN

						INSERT_DATA;

					EXCEPTION
						WHEN DUP_VAL_ON_INDEX THEN
							delete from KF_SEI where
								CD_BLOCKSHO = PM_BLOCKSHO and
								CD_JIGYO = 事業部 and
								CD_BUMON = 部 and
								CD_KA = 課 and
								CD_TORI = SV取引先コード and
								CD_TORI_ST = SV取引先支店コード and
								YMD_SIME_SEI = PM_DATE;

								INSERT_DATA;
						WHEN OTHERS THEN

							NULL;

					END;

					ZERO_CLEAR;

				end if;

			end if;

			if	ソート区分 = 1 then
				売上通常		:= 金額;
				売上通常消費税		:= 消費税;
			elsif	ソート区分 = 2 then
				売上中間請求		:= 金額;
				売上中間請求消費税	:= 消費税;	
			elsif	ソート区分 = 3 then
				売上最終請求		:= 金額;
				売上最終請求消費税	:= 消費税;
			elsif	ソート区分 = 4 then
				売上値引		:= 金額;
				売上値引消費税		:= 消費税;
			elsif	ソート区分 = 5 then
				売上修正		:= 金額;
				売上修正消費税		:= 消費税;
			end if;

			SVブロック小コード		:= ブロック小コード;
			SV取引先コード		:= 取引先コード;
			SV取引先支店コード	:= 取引先支店コード;

		else

			if SVブロック小コード = -1 then
				NULL;
			else
				BEGIN
					INSERT_DATA;

				EXCEPTION
					WHEN DUP_VAL_ON_INDEX THEN
						delete from KF_SEI where
							CD_BLOCKSHO = PM_BLOCKSHO and
							CD_JIGYO = 事業部 and
							CD_BUMON = 部 and
							CD_KA = 課 and
							CD_TORI = SV取引先コード and
							CD_TORI_ST = SV取引先支店コード and
							YMD_SIME_SEI = PM_DATE;

							INSERT_DATA;

					WHEN OTHERS THEN
						NULL;
				END;
			end if;

			exit;

		end if;

	end loop;


/*=====================================================
   終了処理
=====================================================*/
	commit;
	dbms_sql.close_cursor(source_cursor);
	dbms_sql.close_cursor(destination_cursor);
dbms_output.put_line( 'NEC7' );

/*=====================================================
   例外処理
=====================================================*/

EXCEPTION
	WHEN OTHERS THEN
		if dbms_sql.is_open(source_cursor) then
			dbms_sql.close_cursor(source_cursor);
		end if;
		if dbms_sql.is_open(destination_cursor) then
			dbms_sql.close_cursor(destination_cursor);
		end if;


END SAMPLE01;
/












yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[oraPlsql]
CCBot/2.0 (https://commoncrawl.org/faq/)
25/01/22 14:33:02
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube