SQLの窓

2018年05月28日


PL/SQL : Function と Procedure の簡単なサンプル

SELECT 〜 INTO を使用して、社員コードを渡して氏名を取得する

Function : GET_CNAME


簡易 PL/SQL ビルダーのダウンロード(【接続/ダイアログ・ビルド/アイコンクリック・実行/アイコンクリック】 しかできません)

FUNCTION GET_CNAME
(
	/* 文字列引数の定義 */
	PM_STRING IN VARCHAR2
)
/* 戻り値の定義 */
RETURN VARCHAR2

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000) := '初期値の設定';

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

	/* 代入 */
	RET_VALUE := PM_STRING;

	IF RET_VALUE is NULL THEN 
		DBMS_OUTPUT.PUT_LINE( 'NULLデータです' );
		RET_VALUE := '該当者は存在しません';
	ELSE 
		DBMS_OUTPUT.PUT_LINE( 'データ有り' );
		SELECT 氏名 INTO WK_VALUE from 社員マスタ
			WHERE 社員コード = RET_VALUE;
		RET_VALUE := WK_VALUE;
	END IF; 

	/* 戻り値 */
	RETURN RET_VALUE;

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
$if 1=1 $then
EXCEPTION
	WHEN OTHERS THEN
		WK_VALUE := '例外発生:'||SQLCODE||':'||SQLERRM;
		DBMS_OUTPUT.PUT_LINE( WK_VALUE );
		RET_VALUE := '該当データがシステムに存在しません';
		RETURN RET_VALUE;
$end
END;


カーソルを使用してデータを読み込んで、csv データをディレクトリオブジェクト経由でディスクにファイルを出力する

Procedure : LIST_MEMBER


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( 'LOGDIR', 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;

データ作成

mdb よりデータを作成する スクリプト(32ビット用/cscript.exe で呼び出せば 64ビット)のダウンロード

26、27、29 行目を環境に合わせて変更

※  ディレクトリオブジェクトの作成

関連する記事

Oracle : PL/SQL Function の使用方法

Oracle 11g 学習環境の作成 : SQLPlus の環境作成
Oracle SQLPlus でスキーマの作成




posted by lightbox at 2018-05-28 12:08 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

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
データ作成 mdb よりデータを作成する スクリプト(32ビット用/cscript.exe で呼び出せば 64ビット)のダウンロード 26、27、29 行目を環境に合わせて変更 ※ ディレクトリオブジェクトの作成 関連する記事 PL/SQL : Function と Procedure の簡単なサンプル Oracle 11g 学習環境の作成 : SQLPlus の環境作成 Oracle SQLPlus でスキーマの作成
posted by lightbox at 2018-05-28 11:28 | Oracle : PL/SQL | このブログの読者になる | 更新情報をチェックする

Oracle SQLPlus でスキーマの作成

Oracle は他の RDBMS と違ってテーブルを作ってアクセスするようにする為にいろいろなものを作成して設定する必要があります。

ここでは、SQLPlus を使用して SQL と コマンドを使用してテーブルを作成する事ができる状態までの環境を作成します。

一応、SQLPlus の環境としては、以下の記事で作成したものを使用しますが、普通に SQLPlus に SYSTEM ユーザでログインすれば可能なはずです( as SYSDBA は使用したほうがいいと思いますが )

Oracle 11g 学習環境の作成 : SQLPlus の環境作成
( この記事内で、データファイルを置くパスを確認しています )

環境作成用の sql を3つ作成する

SQLPlus のワークディレクトリに置きます。専用のフォルダに置いて作業するといいと思います。
create tablespace STUDY
datafile 'C:\APP\LIGHTBOX\ORADATA\ORCL\STUDY.DBF'
	size 5M
	autoextend on
	next 1M
	maxsize unlimited
segment space management AUTO;


create user LIGHTBOX
	identified by study
	default tablespace STUDY
	temporary tablespace TEMP
	quota unlimited on STUDY
	account unlock;

create role STUDY_ROLE;

grant 
	 ALTER PROFILE 
	,ALTER SESSION 
	,ALTER SYSTEM 
	,ALTER TABLESPACE 
	,ALTER USER 
	,CREATE PROCEDURE 
	,CREATE PROFILE 
	,CREATE PUBLIC SYNONYM 
	,CREATE ROLE 
	,CREATE ROLLBACK SEGMENT 
	,CREATE SEQUENCE 
	,CREATE SESSION 
	,CREATE SYNONYM 
	,CREATE TABLE 
	,CREATE TABLESPACE 
	,CREATE TRIGGER 
	,CREATE VIEW 
	,EXECUTE ANY PROCEDURE 
	,SELECT ANY DICTIONARY 
	,SELECT ANY SEQUENCE 
	,SELECT ANY TABLE
to STUDY_ROLE;

grant STUDY_ROLE to LIGHTBOX;

この3つの SQL を順番に実行します。SQLPlus 内では、それぞれ以下のように入力すると実行されます。
@tablespace
@createuser
@createrole
全て実行した後は、ユーザが lightbox パスワードが study でログインできるはずです。 (ユーザパスワードの変更は alter user で実行します) recyclebin を使用しないようにする デフォルトでは使用する事になっているので、テーブル一覧に不明な recyclebin 用のテーブルが表示されたりします。もともと、削除したテーブルの復帰用なので学習には不向きで邪魔なだけなので使用しないようにします。 ▼ SQLPlus で以下を実行してください
alter system set recyclebin = off deferred;
DEFERREDキーワード は次のセッションで有効にするという意味です。SQLPlus ではいったん quit して再度接続すると有効になっていると思います。確認は以下の SQLPlus コマンド を実行して下さい。
show parameter recyclebin
SQL で見る場合は 『select * from V$PARAMETER where name = 'recyclebin';』ですが、SQLPlus では見づらいのでコマンドを使用して下さい。 データ作成 mdb よりデータを作成する スクリプト(32ビット用/cscript.exe で呼び出せば 64ビット)のダウンロード 26、27、29 行目を環境に合わせて変更 ※ ディレクトリオブジェクトの作成 関連する記事 Oracle 11g 学習環境の作成 : SQLPlus の環境作成
posted by lightbox at 2018-05-28 11:26 | Oracle : 環境 | このブログの読者になる | 更新情報をチェックする

Oracle 11g 学習環境の作成 : SQLPlus の環境作成

手元の環境は、Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production です。32ビットなので、64ビットのPC では少しいろいろありますが、スキーマ作成に関して基本は SQL を用意してコマンドを入力して実行するという手順になります。

Oracle をインストールしたユーザであれば問題無いはすですが、ユーザが ora_dba グループに入っている事を確認します。



1) sqlplus 用のフォルダを用意して、そこで sqlplus を実行

c:\tools\oracle というフォルダを作成しました。そこに、コマンドプロンプトのショートカットを作成します。
※ Windows システムツールの中にあるので、コピーして使用しますが、無ければ直接 cmd.exe でショートカットを作成します。
※ アイコンを右クリックして『その他』=>『ファイルの場所を開く』でそこからコピーします

2) ショートカットの情報を変更

a) リンク先は、このように入力すると Oracle インストール済みならばフルパスを補完してくれます。
b) 作業フォルダーはクリアすればカレントフォルダで起動します。



c) 詳細設定では念のため管理者権限にチェックしておきます。



タイトルは何でもいいので、全般タブで変更します。



3) sqlplus の初期設定用 login.sql をフォルダに置く
SET VERIFY OFF
SET SERVEROUTPUT ON
SET LINESIZE 200
SET PAGESIZE 1000
--SET AUTOCOMMIT IMM

行頭の -- は行コメントです。
※ SET SERVEROUTPUT ON を指定しないと、DBMS_OUTPUT の結果が表示されません
※ SET AUTOCOMMIT IMM を指定すると、SQL の UPDATE 時に 自動的にコミットされます

4) sqlplus を実行してコマンドウインドウの設定を行う

コマンドウインドウ上でドラッグでコピー、右クリックでペーストできるように簡易編集モードを ON にします。



作業しやすいように好みの幅にコマンドウインドウサイズを変更します。



5) login.sql の内容が反映されているかを確認する

SQL プロンプトで show all と入力して、SERVEROUTPUT が ON である事を確認する





6) Oracle のデータの場所を確認しておく

以下を入力して *.DBF ファイルの場所を確認します。

select * from DBA_DATA_FILES;

スキーマを作成する際に、データファイルと表領域を事前に作成するので確認します。




データ作成

mdb よりデータを作成する スクリプト(32ビット用/cscript.exe で呼び出せば 64ビット)のダウンロード

26、27、29 行目を環境に合わせて変更

※  ディレクトリオブジェクトの作成


関連する記事

Oracle SQLPlus でスキーマの作成




posted by lightbox at 2018-05-28 11:25 | Oracle : 環境 | このブログの読者になる | 更新情報をチェックする

2018年05月26日


IIS10 を AppCmd.exe を使用して運用する

環境
OS : Windows10 : Windows NT 10.0; Win64; x64
IIS : Microsoft-IIS/10.0
PHP : 5.6.36 : VC11 x86 Non Thread Safe
※ appcmd.exe は C:\Windows\System32\inetsrv にあります ( インターネット インフォメーション サービス (IIS) マネージャー のショートカットのリンク先の InetMgr.exe と同じ場所 ) IIS の基本設定 Windows10 IIS の設定 php.ini の設定として重要なのは、最初は以下の3つです。
cgi.force_redirect = 0
date.timezone = Asia/Tokyo
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

php.ini の内容を確認する為に、info.php を作成して以下のようにします。
<?php
phpinfo();
?>

php.ini を変更して appcmd.exe で反映させる

▼ php.ini の変更は、アプリケーションプールの『リサイクル』を実行する必要があります


これを appcmd.exe で実行するには以下のようなバッチファイルで可能です。
※ 管理者権限で実行する必要があります
setlocal

@path=%path%;C:\Windows\System32\inetsrv

appcmd recycle APPPOOL "DefaultAppPool"

endlocal


オプションで変更した php.ini の内容
default_charset = "shift_jis"
short_open_tag = On
include_path = ".;c:\php\includes"
extension_dir = "ext"
allow_url_include = On
extension=php_com_dotnet.dll
extension=php_curl.dll
extension=php_fileinfo.dll
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_exif.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_openssl.dll
extension=php_sqlite3.dll
sendmail_path = "C:\pleiades\xampp\sendmail\sendmail.exe"
session.gc_maxlifetime = 5400

appcmd.exe で アプリケーションの追加

新しいPCに保存しておいた環境を構築する場合、一括で作成できます
※ 管理者権限で実行する必要があります
setlocal

@path=%path%;C:\Windows\System32\inetsrv

appcmd add APP /site.name:"Default Web Site" /path:/ab /physicalPath:"C:\user\lightbox\web\system\webhost\ab"
appcmd add APP /site.name:"Default Web Site" /path:/ad /physicalPath:"C:\user\lightbox\web\system\webhost\ad"
appcmd add APP /site.name:"Default Web Site" /path:/admin /physicalPath:"C:\user\lightbox\web\system\webhost\admin"
appcmd add APP /site.name:"Default Web Site" /path:/misc /physicalPath:"C:\user\lightbox\web\system\webhost\misc"

endlocal


その他の appcmd.exe での処理
▼ 停止
appcmd stop SITE "Default Web Site"

▼ 開始
appcmd start SITE "Default Web Site"

▼ ディリクトリの参照を可能にする
appcmd set config "Default Web Site" -section:system.webServer/directoryBrowse /enabled:"True"

参考記事( Microsoft TechNet ) AppCmd.exe の使用の開始 ディレクトリの参照
posted by lightbox at 2018-05-26 21:15 | Windows10 | このブログの読者になる | 更新情報をチェックする

2018年05月22日


PowerShell で C# のソースコード(get_rec_mysql.cs) を使用して System.Data.Odbc で MySQL のデータを一覧表示( csv )

▼ ps.bat : このバッチファイルがある場所にパスを通しています
@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"
PowerShell で System.Data.Odbc を使用して MySQL のデータを一覧表示( csv ) では、PowerShell の記述で処理しましたが、特異な環境や目的でも無いかぎり、C# のコードを直接使用したほうが、流用しやすくコストが安く済みます。 get_rec_mysql.cs は、一般的な using を使用した単純なデータベースの行の取得です。このコードを PowerShell で実行するには以下の3行で可能です。
Add-Type -path "get_rec_mysql.cs" `
	-ReferencedAssemblies System.Windows.Forms, System.Data
[Program]::Start()
get_rec_mysql.cs
using System;
using System.Data.Odbc;
using System.Windows.Forms;

public class Program
{
	public static void Start()
	{

		loadMySql();

		Console.WriteLine( "処理が終了しました" );

		MessageBox.Show("処理が終了しました");

	}

	public static void loadMySql() {

		using (OdbcConnection myCon = new OdbcConnection())
		using (OdbcCommand myCommand = new OdbcCommand())
		{
			// 新しい OdbcConnectionStringBuilder オブジェクトを作成
			OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

			// ドライバ文字列をセット ( 波型括弧{} は必要ありません )
			// 文字列を正確に取得するには、レジストリ : HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
			builder.Driver = "MySQL ODBC 5.3 Unicode Driver";

			// 接続用のパラメータを追加
			builder.Add("SERVER", "localhost");
			builder.Add("DATABASE", "lightbox");
			builder.Add("UID", "root");
			builder.Add("PWD", "");

			// 内容を確認
			Console.WriteLine(builder.ConnectionString);

			myCon.ConnectionString = builder.ConnectionString;

			// *********************
			// 接続
			// *********************
			try
			{
				// 接続文字列を使用して接続
				myCon.Open();
				// コマンドオブジェクトに接続をセット
				myCommand.Connection = myCon;
				// コマンドを通常 SQL用に変更
				myCommand.CommandType = System.Data.CommandType.Text;
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message);
				return;
			}

			// *********************
			// 実行 SQL
			// *********************
			myCommand.CommandText = "select * from 社員マスタ";

			// *********************
			// レコードセット取得
			// *********************
			try 
			{
				using (OdbcDataReader myReader = myCommand.ExecuteReader())
				{
					string csv_format = "{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}";
					string out_line = "";

					while( myReader.Read() ) {

						out_line = string.Format(csv_format,
							myReader.GetValue(0).ToString(),
							myReader.GetValue(1).ToString(),
							myReader.GetValue(2).ToString(),
							myReader.GetValue(3).ToString(),
							myReader.GetValue(4).ToString(),
							myReader.GetValue(5).ToString(),
							myReader.GetValue(6).ToString(),
							myReader.GetValue(7).ToString(),
							myReader.GetValue(8).ToString(),
							myReader.GetValue(9).ToString(),
							myReader.GetValue(10).ToString()
						);

						Console.WriteLine( out_line );

					}
					// リーダを使い終わったので閉じる
					myReader.Close();
				}
			}
			catch (Exception ex)
			{
				myCon.Close();
				MessageBox.Show(ex.Message);
				return;
			}

			// 接続解除
			myCon.Close();
 

		}
	}

}




posted by lightbox at 2018-05-22 19:57 | PowerShell + C# | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり