SQLの窓

2018年05月20日


Oracle : PL/SQL Function の使用方法

Function オブジェクトは Procedure オブジェクトと違い、select 文の列名リストの中で使用できるので簡単に結果を体験できる有用なオブジェクトです。

サンプル : MF
CREATE OR REPLACE FUNCTION MF
(
	PM_STRING IN NUMBER	/* 引数の定義 */
)
RETURN VARCHAR2	/* 戻り値の定義 */

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');
	DBMS_OUTPUT.PUT_LINE('デバッグ:引数:'||PM_STRING);

	if PM_STRING = 0 then
		RET_VALUE := '男';
	else
		RET_VALUE := '女';
	end if;
	RETURN RET_VALUE;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		RET_VALUE := '例外発生:'||SQLCODE||':'||SQLERRM;
		RETURN RET_VALUE;
END;

SQL の窓 build c++ で作成できます


確認用 SQL 文
select 社員コード
	,氏名
	,フリガナ
	,所属
	,性別
	,mf(性別) as 性別名
	,作成日
	,更新日
	,給与
	,手当
	,管理者
	,生年月日 
 from 社員マスタ



DBMS_OUTPUT の結果を表示する為には、SQLPlus を使用します。
( Oracle 11g 学習環境の作成 : SQLPlus の環境作成 )

SET SERVEROUTPUT ON の設定により、select 文を実行しただけで、DBMS_OUTPUT の内容が表示されますが、Call 文を使用して、単独でテストすることが可能です。
SQL> variable str VARCHAR2(10);
SQL> call mf(0) into :str;
デバッグ:開始
デバッグ:引数:0

コールが完了しました。

SQL> print str

STR
----------------------------------------------------------------
男

▼ ソースコードは以下の SQL で取得可能です。
select * from USER_SOURCE where NAME = 'MF' order by LINE
posted by lightbox at 2018-05-20 01:03 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

2011年10月02日


PL/SQL : 最も簡単な CSV 出力 の記述

CSV イメージを最初から SQL で作成しておいて、取りだすデータが 1つの列にしておく事で高速な処理が可能になります
CREATE OR REPLACE PROCEDURE LIST_MEMBER
(
	/* カーソルの範囲指定用  */
	PM_STRING IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	WK_VALUE	VARCHAR2(2000);

	/* カーソルの定義(主に複数読み込み用)  */
	CURSOR cur_main IS
		SELECT
			社員コード||','||
			氏名||','||
			フリガナ||','||
			所属||','||
			性別||','||
			作成日||','||
			更新日||','||
			給与||','||
			手当||','||
			管理者||','||
			生年月日
			from "社員マスタ"
		where 社員コード <= PM_STRING;

	-- ディスクへ書き込むファイル名
	WK_FILENAME VARCHAR2(100) := 'syain.csv';
	-- ファイルにアクセスする為のハンドルの定義
	FILEHANDLE UTL_FILE.FILE_TYPE;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');
	DBMS_OUTPUT.PUT_LINE('デバッグ:引数:'||PM_STRING);

	/* カーソルを開く */
	OPEN cur_main;

	-- 第一引数は、ディレクトリオブジェクトの名称( 但し文字列 )
	FILEHANDLE := UTL_FILE.FOPEN( 'MYDIR', WK_FILENAME, 'w' );

	/* ループ処理(ブロック) */
	LOOP 
		/* 定義したレコード変数に読み込み */
		FETCH cur_main INTO WK_VALUE;
		/* カーソルに対するシステム変数でデータ終わりを判断 */
		if cur_main%NOTFOUND then 
			/* ループ処理を脱出 */
			EXIT; 
		end if; 

		-- 書き込み
		UTL_FILE.PUT_LINE(FILEHANDLE,WK_VALUE);
	 
	END LOOP; 

	-- ファイルを閉じる
	UTL_FILE.FCLOSE( FILEHANDLE );

	/* カーソルを閉じる */
	CLOSE cur_main;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
$if 1=1 $then
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
$end
END;




posted by lightbox at 2011-10-02 00:18 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

2011年09月10日


Oracle : PL/SQL : 暗黙のカーソルとループブロックを使用した自動行挿入

この書き方の目的は、更新対象の行が存在しなかった場合に自動的に行を追加して、集計更新の処理を継続する事です。

一回目の UPDATE でもし対象行が無ければ、暗黙のカーソルによって条件が設定されるので、INSERT 文で初期レコードを作成してループ処理でもう一度 UPDATE 文が実行されます。その場合は必ず対象行が存在するので、初回の集計がなされた後、ループを抜ける事になります。

もし、既に行が存在する場合は UPDATE 後には即ループを抜けます
LOOP
	UPDATE 集計用テーブル SET
		"現物数量" = "現物数量" - PM_数量,
		"更新日" = sysdate
	WHERE
		"組織" = V組織
		AND "大分類" = V大分類
		AND "商品コード" = V商品コード;
	IF SQL%NOTFOUND THEN
		INSERT INTO 集計用テーブル
		 VALUES (V組織,V大分類,V商品コード,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,NULL,sysdate,NULL,sysdate,0,0
		,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		,0,0,0);
	ELSE
		EXIT;
	END IF;
END LOOP;




タグ:Oracle PL/SQL
posted by lightbox at 2011-09-10 09:39 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり