ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
少しづつ Oracle
日時: 2008/07/26 15:11
名前: lightbox



1) テーブル作成と行追加を同時に行なう
2) エクスポートユーティリティのテーブル単位の出力( コマンドライン )
3) インポートユーティリティで、表定義を取得する
4) 一時表
5) PL/SQL で エクスポート
6) select で使用できるパッケージ・ファンクション
7) ユーザが使用できないパッケージの一覧を取得
8) プロセスを終了させる SQL を作る SQL
9) ディレクトリオブジェクトの作成
10) PL/SQL でメール送信
11) CSV 出力
12) 別スキーマ間のテーブルコピー
13) MDB 接続で書く別スキーマ間のテーブルコピーの為のSQL
14) ダンプファイルから、別スキーマへテーブルコピー
15) 複数のSQLを一括で実行するスクリプト( Oracle 接続 )
16) 複数のSQLを一括で実行するスクリプト( MDB 接続 )
17) PL/SQL で表定義のSQLを取得
18) オンラインで CSV を出力する

SQL文の分類
データ操作言語 (DML)SELECT,INSERT,UPDATE,DELETE,MERGE
データ定義言語 ((DDL)CREATE TABLE,TRUNCATE TABLEなど
データ制御言語 (DCL)GRANT,REVOKEなど
トランザクション制御COMMIT,ROLLBACK,SAVEPOINTなど
↓社員マスタ
列名型値型定数型名最大桁精度スケールNULL主キーデフォルト
1社員コード129adCharVARCHAR24N1
2氏名129adCharVARCHAR250
3フリガナ129adCharVARCHAR250
4所属129adCharVARCHAR24
5性別131adNumericNUMBER10
6作成日135adDBTimeStampDATE
7更新日135adDBTimeStampDATE
8給与131adNumericNUMBER15
9手当131adNumericNUMBER15
10管理者129adCharVARCHAR24
11生年月日135adDBTimeStampDATE
メンテナンス

テーブル作成と行追加を同時に行なう ( No.1 )
日時: 2008/06/21 14:20
名前: lightbox


日時: 2008/06/21 14:20
名前: lightbox
基本構文
拡張子:
CREATE TABLE 表名
   [ ( 列リスト) ]
AS
   ( サブクエリー )
列リストを指定せずに、サブクエリーのSELECT 句で * のみを指定すると、同じフォーマットの 表が作成され、SELECT 文の結果となる行が全て追加されます ※ その際、制約は NOT NULL 制約しかコピーされません
拡張子:
create table 社員
 as
select * from 社員マスタ
空の表を作成したい場合は、副問合せの WHERE句の条件が一致しないようにします
拡張子:
create table 社員
 as
select * from 社員マスタ where 1 = 2
列名リストを指定すると制約やデフォルト値を設定可能です
拡張子:
create table 社員 (
	社員コード
	,氏名
	,フリガナ
	,支給額 default 0
	,primary key( 社員コード )
)
 as
select
	社員コード
	,氏名
	,フリガナ
	,NVL(給与,0)+NVL(手当,0)
from
	社員マスタ
列名型値型定数型名最大桁精度スケールNULL主キーデフォルト
1社員コード129adCharVARCHAR24N1
2氏名129adCharVARCHAR250
3フリガナ129adCharVARCHAR250
4支給額131adNumericNUMBER150
デフォルト値を持つ列は、insert 文で列リストで指定されない場合に その値が設定されます。 ↓支給額は、0 がセットされる
拡張子:
insert into "社員" (
	"社員コード" 
	,"氏名" 
	,"フリガナ" 
)
 values(
	'0051'
	,'浦岡 友也'
	,'ウラオカ トモヤ'
)
また、SQL 内で、その値をあらわすキーワードとして使用可能です
拡張子:
update "社員" set 
	"氏名" = '浦岡 友也'
	,"フリガナ" = 'ウラオカ トモヤ'
	,"支給額" = default
 where
 "社員コード" = '0051'
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
エクスポートユーティリティのテーブル単位の出力( コマンドライン ) ( No.2 )
日時: 2008/07/12 20:48
名前: lightbox
拡張子:
expdp ORA01/ORA01@//night/XE DIRECTORY=MYDIR DUMPFILE=ORA01.dmp SCHEMAS=ORA01 INCLUDE=TABLE:\"IN ('社員マスタ', '商品マスタ')\"
※ データを含めない場合は、CONTENT=METADATA_ONLY を追加 ※ DIRECTORY は省略不可。指定した上で、各ファイルは個別のディレクトリオブジェクトを指定可能 ※ ORA01.dmp は上書き不可 ※ コマンドラインのダブルクォートはエスケープの必要があります ※ SCHEMASのかわりに、TABLES も使えますが、LIKE ('%マスタ')というような使い方ができますのでこちらが良いです 【ディレクトリオブジェクトの作成】 コマンドラインのヘルプは以下
拡張子:
expdp HELP=y
パラメータファイルを使用すると以下のような実行になります
拡張子:
expdp ORA01/ORA01@//night/XE parfile=c:\user\param.txt
※ パラメータファイルは、ファイルシステムで指定します ↓param.txt
拡張子:
DIRECTORY=MYDIR
DUMPFILE=MYDIR:ORA01.dmp
SCHEMAS=ORA01
INCLUDE=TABLE:"IN ('社員マスタ', '商品マスタ')"
CONTENT=METADATA_ONLY
Oracle へのリンク【 INCLUDE 】 Oracle へのリンク【 PARFILE 】
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
インポートユーティリティで、表定義を取得する ( No.3 )
日時: 2009/06/22 22:46
名前: lightbox
PL/SQL で書かれた統計データの処理が出力される場合は、ダンプファイルを作成する前に、
面倒ですが、テーブル毎に以下のSQLを実行する必要があります
拡張子:
ANALYZE TABLE テーブル名 DELETE STATISTICS
エクスポートユーティリティのテーブル単位の出力 で出力した ORA01.dmp を使用しています
拡張子:
impdp ORA01/ORA01@//night/XE DIRECTORY=MYDIR DUMPFILE=ORA01.dmp SQLFILE=MYDIR:ddl.txt
ddl.txt 内のテキストの一部
拡張子:
-- CONNECT ORA01
-- new object type path is: SCHEMA_EXPORT/TABLE/TABLE
CREATE TABLE "ORA01"."商品マスタ" 
   (	"商品コード" VARCHAR2(4), 
	"商品名" VARCHAR2(75), 
	"在庫評価単価" NUMBER, 
	"販売単価" NUMBER, 
	"商品分類" VARCHAR2(3), 
	"商品区分" VARCHAR2(1), 
	"作成日" DATE, 
	"更新日" DATE, 
	"備考" VARCHAR2(2000), 
	"削除フラグ" VARCHAR2(1)
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "LBOX_USER1" ;
 
CREATE TABLE "ORA01"."社員マスタ" 
   (	"社員コード" VARCHAR2(4), 
	"氏名" VARCHAR2(50), 
	"フリガナ" VARCHAR2(50), 
	"所属" VARCHAR2(4), 
	"性別" NUMBER(1,0), 
	"作成日" DATE, 
	"更新日" DATE, 
	"給与" NUMBER, 
	"手当" NUMBER, 
	"管理者" VARCHAR2(4), 
	"生年月日" DATE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "LBOX_USER1" ;
 
-- new object type path is: SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
ALTER TABLE "ORA01"."商品マスタ" ADD PRIMARY KEY ("商品コード")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "LBOX_USER1"  ENABLE;
 
ALTER TABLE "ORA01"."社員マスタ" ADD PRIMARY KEY ("社員コード")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "LBOX_USER1"  ENABLE;

通常の CREATE 文を出力したい場合は以下のようにして下さい
拡張子:
impdp ORA01/ORA01@//night/XE DIRECTORY=MYDIR DUMPFILE=ORA01.dmp TRANSFORM=SEGMENT_ATTRIBUTES:n SQLFILE=MYDIR:ddl.txt
Data Pump Import
拡張子:
-- CONNECT ORA01
-- new object type path is: SCHEMA_EXPORT/TABLE/TABLE
CREATE TABLE "ORA01"."商品マスタ" 
   (	"商品コード" VARCHAR2(4), 
	"商品名" VARCHAR2(75), 
	"在庫評価単価" NUMBER, 
	"販売単価" NUMBER, 
	"商品分類" VARCHAR2(3), 
	"商品区分" VARCHAR2(1), 
	"作成日" DATE, 
	"更新日" DATE, 
	"備考" VARCHAR2(2000), 
	"削除フラグ" VARCHAR2(1)
   ) ;
 
CREATE TABLE "ORA01"."社員マスタ" 
   (	"社員コード" VARCHAR2(4), 
	"氏名" VARCHAR2(50), 
	"フリガナ" VARCHAR2(50), 
	"所属" VARCHAR2(4), 
	"性別" NUMBER(1,0), 
	"作成日" DATE, 
	"更新日" DATE, 
	"給与" VARCHAR2(255), 
	"手当" VARCHAR2(255), 
	"管理者" VARCHAR2(4), 
	"生年月日" DATE
   ) ;
 
-- new object type path is: SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
ALTER TABLE "ORA01"."商品マスタ" ADD PRIMARY KEY ("商品コード") ENABLE;
 
ALTER TABLE "ORA01"."社員マスタ" ADD PRIMARY KEY ("社員コード") ENABLE;
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
一時表 ( No.4 )
日時: 2008/07/06 20:40
名前: lightbox
 関連ページ : 一時表で加工データを作成 

拡張子:
※ 注意1
初めて一時表を作成した時点では、その表のメタデータはデータ・ディクショナリに格納されますが、
表データの領域は割り当てられません。

※ 注意2
表セグメントの領域は、その表に初めてDML操作を実行したときに割り当てられます。

※ 注意3
一時表の定義は、標準的な表の定義と同じように維持されます。

※ 注意4
表に含まれる表セグメントとデータは、セッション固有またはトランザクション固有のデータのいずれかになり、
ON COMMITキーワードで指定します。

※ 注意5
DELETE ROWSは、トランザクション固有の一時表に対して指定します。
これはデフォルトです。各コミット後に表が切り捨てられます(すべての行が削除されます)。

※ 注意6
PRESERVE ROWSは、セッション固有の一時表に対して指定します。
セッション終了時に表が切り捨てられます(すべての行が削除されます)。
一時表の定義はすべてのセッションで参照できますが、一時表内のデータを参照できるのは、 そのデータを表に挿入するセッションのみです。複数のクライアントからアクセスされても、 アクセスしたクライアントのデータしか見えません 以下は、ダンプファイルより取得した表定義を使った一時表の定義です
拡張子:
CREATE GLOBAL TEMPORARY TABLE "社員加工元データ" 
   (	"社員コード" VARCHAR2(4), 
	"氏名" VARCHAR2(50), 
	"フリガナ" VARCHAR2(50), 
	"所属" VARCHAR2(4), 
	"性別" NUMBER(1,0), 
	"作成日" DATE, 
	"更新日" DATE, 
	"給与" NUMBER(10,2), 
	"手当" NUMBER(8,1), 
	"管理者" VARCHAR2(4), 
	"生年月日" DATE,
	PRIMARY KEY ("社員コード")
   ) ON COMMIT PRESERVE ROWS
インポートユーティリティで、表定義を取得する
拡張子:
Microsoft の Oracle 用 ODBC ドライバを使用すると、デフォルトで60 秒間接続が継続されるので
処理後接続を閉じるツールを使っても、一時表の内容を見る事ができます
※ 何もアクセスせずに 60 秒が経つと、データはクリアされます
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
PL/SQL で エクスポート ( No.5 )
日時: 2008/07/23 16:54
名前: lightbox
拡張子:
基本的に Data Pump Exportユーティリティと同じものです
ですから、Data Pump Export の仕様で、既に存在するファイルに書き出そうとするとエラーになります

※ 最後の J_STS は、COMPLETED と表示されます

各プロシージャの詳細は Oracle ドキュメント : DBMS_DATAPUMP
拡張子:
PROCEDURE DATAPUMP

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	J_HANDLE NUMBER;
	J_STS VARCHAR2(20);
/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	/***************************/
	/* OPEN */
	/***************************/
	J_HANDLE := DBMS_DATAPUMP.OPEN(
		'EXPORT'
		,'TABLE'
		,NULL
		,NULL
		,'COMPATIBLE'
		,DBMS_DATAPUMP.KU$_COMPRESS_METADATA
	);

	/***************************/
	/* 出力ファイル */
	/***************************/
	DBMS_DATAPUMP.ADD_FILE(
		J_HANDLE
		,'TABLE_BACKUP_TEST.ORA'
		,'MYDIR'
		,NULL
		,DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
	);

	/***************************/
	/* SQL 式で スキーマを指定 */
	/***************************/
	DBMS_DATAPUMP.METADATA_FILTER(
		J_HANDLE
		,'SCHEMA_EXPR'
		,'IN (''ORA_01'')'
	);

	/***************************/
	/* SQL 式で 表を指定 */
	/***************************/
	DBMS_DATAPUMP.METADATA_FILTER(
		J_HANDLE
		,'NAME_EXPR'
		,'IN (''社員マスタ'',''商品マスタ'')'
	);

	/***************************/
	/* データを出力しない */
	/***************************/
	DBMS_DATAPUMP.DATA_FILTER (
		J_HANDLE
		,'INCLUDE_ROWS'
		,0
	);

	/***************************/
	/* 開始 */
	/***************************/
	DBMS_DATAPUMP.START_JOB(
		J_HANDLE
		,0
	);

	/***************************/
	/* JOB 終了まで待機 */
	/***************************/
	DBMS_DATAPUMP.WAIT_FOR_JOB(
		J_HANDLE
		,J_STS
	);

	/***************************/
	/* 終了ステータスの表示 */
	/***************************/
	DBMS_OUTPUT.PUT_LINE('処理終了:'||J_STS);

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
select で使用できるパッケージ・ファンクション ( No.6 )
日時: 2008/07/03 00:37
名前: lightbox
直接役に立つものではありませんが、使えるものは知っておかないと。

拡張子:
select
	UTL_INADDR.GET_HOST_ADDRESS('winofsql.jp') as IPアドレス
	,UTL_INADDR.GET_HOST_NAME('127.0.0.1') as HOST名
	,UTL_I18N.TRANSLITERATE('アイウエオ','hwkatakana_fwkatakana') as 半カナto全カナ
	,FLOOR(DBMS_RANDOM.VALUE(1,20)) as 乱数
	,DBMS_CRYPTO.RANDOMINTEGER() as ORACLE整数乱数
	,UTL_ENCODE.TEXT_ENCODE (chr(0)||'lightbox'||chr(0)||'password',null,1) as PLAIN認証
	,RAWTOHEX(DBMS_CRYPTO.HASH(
		UTL_I18N.STRING_TO_RAW('123')
		,2
	)) as md5
	,RAWTOHEX(DBMS_CRYPTO.MAC(
		UTL_I18N.STRING_TO_RAW('5339717501972784@localhost')
		,1
		,UTL_I18N.STRING_TO_RAW('password')
	)) as "CRAM-MD5"
	,UTL_I18N.RAW_TO_CHAR(
		UTL_ENCODE.BASE64_ENCODE(
			UTL_I18N.STRING_TO_RAW('lightbox')
		)
	) as base64encode
from dual
●IPアドレス
59.106.19.54
●HOST名
night
●半カナTO全カナ
アイウエオ
●乱数
13
●ORACLE整数乱数
524512275
●PLAIN認証
AGxpZ2h0Ym94AHBhc3N3b3Jk
●MD5
202CB962AC59075B964B07152D234B70
●CRAM-MD5
0D380EF34732479BF25C202163D57758
●BASE64ENCODE
bGlnaHRib3g=
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
ユーザが使用できないパッケージの一覧を取得 ( No.7 )
日時: 2008/07/03 10:50
名前: lightbox
まず、SELECT ANY DICTIONARY システム権限が必要なので、
以下の SQL であるかどうか確かめます

拡張子:
select PRIVILEGE 
 from USER_SYS_PRIVS

 union

select PRIVILEGE 
 from ROLE_SYS_PRIVS 

 order by PRIVILEGE
もし無かったら、SQLPlus で、SYS でログインするか、ローカルで以下のようにします
拡張子:
sqlplus / as sysdba
※ 実行している Windows ユーザが ORA_DBA グループに所属している必要があります そして、grant で SELECT ANY DICTIONARY 権限を付与します
拡張子:
grant 
	SELECT ANY DICTIONARY
to ORACLEのユーザ
そして以下の SQL を実行すると、実行権限の無いパッケージの一覧を取得できます
拡張子:
select distinct
	DBA_TAB_PRIVS.OWNER,
	DBA_TAB_PRIVS.TABLE_NAME

from 
	DBA_TAB_PRIVS
	left outer join ALL_TAB_PRIVS
	on
	   DBA_TAB_PRIVS.TABLE_NAME = ALL_TAB_PRIVS.TABLE_NAME
	left outer join DBA_OBJECTS
	on
	   DBA_TAB_PRIVS.OWNER = DBA_OBJECTS.OWNER
	   and DBA_TAB_PRIVS.TABLE_NAME = DBA_OBJECTS.OBJECT_NAME

where
	DBA_TAB_PRIVS.PRIVILEGE = 'EXECUTE'
	and ALL_TAB_PRIVS.TABLE_NAME is NULL
	and DBA_OBJECTS.OBJECT_TYPE = 'PACKAGE'

order by DBA_TAB_PRIVS.TABLE_NAME
そして、使用可能にするには、再び grant で権限を付与します。 ( 以下は実際の例です )
拡張子:
grant execute on sys.utl_file to lightbox;
また、実行できるオブジェクトの一覧は以下で取得して下さい
拡張子:
select * from ALL_TAB_PRIVS where PRIVILEGE = 'EXECUTE'
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
プロセスを終了させる SQL を作る SQL ( No.8 )
日時: 2008/07/03 10:59
名前: lightbox
使うのは、PL/SQL で失敗して永久ループさせてしまった時でしょうか。
いずれにしても、本番稼動している Oracle では絶対にしないように

拡張子:
select 
	V$SESSION.SID,
	USERNAME,
	STATUS,
	PROGRAM,
	LOCKWAIT,
	SQL_TEXT,
	'alter system kill session ''' || V$SESSION.SID || ',' || serial# || ''''
	from V$SESSION,V$OPEN_CURSOR
	where
		SQL_ADDRESS = ADDRESS
		and USERNAME is not NULL
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
ディレクトリオブジェクトの作成 ( No.9 )
日時: 2008/07/03 11:54
名前: lightbox
拡張子:
Oracle では、ローカルのファイルシステムにアクセスする為に、
ディレクトリオブジェクトが必要になります。
これを作成するには、権限 が必要になりますので、
今後の管理を考えて選択をします

1) SYSTEM ユーザーで管理する
2) 各スキーマで管理する

それぞれによってやり方が変わって来ますので注意して下さい

SYSTEM ユーザで管理する場合は、まず SYSTEM ユーザにログイン
できなければなりません。最近は、Express Edition が使えるので
インストールしたけれども、パスワードを忘れた・・・という可能性もありますので
そのような場合は以下のようにしてパスワードを変更して下さい

1) windows のログインユーザーが ORA_DBA グループに属している事を確認する


2) Sqlplus で以下のようにログインする
拡張子:
sqlplus / as sysdba
3) 以下の SQL を実行する
拡張子:
ALTER USER SYSTEM IDENTIFIED BY パスワード
( 例:ALTER USER SYSTEM IDENTIFIED BY MANAGER )
※ sysdba で管理するのは除外しています SYSTEM で管理する場合はここを参照して下さい 各スキーマで管理する場合はそのユーザでログインして、 CREATE ANY DIRECTORY と DROP ANY DIRECTORY 権限が付与されているかを 以下の SQL で確認して下さい
拡張子:
select PRIVILEGE 
 from USER_SYS_PRIVS

 union

select PRIVILEGE 
 from ROLE_SYS_PRIVS 

 order by PRIVILEGE
付与されている場合は、以下のリンク先の「作成」から実行して下さい http://winofsql.jp/VA003334/plsql080113005808.htm 付与されていない場合は、最初から実行して下さい。 ( SYSTEM ユーザでのログインが必要になりますが、grant だけならば、sysdba で実行しても良いです )
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
PL/SQL でメール送信 ( No.10 )
日時: 2008/07/05 13:26
名前: lightbox
日本語に UTF-8 を使用しているので、正式な使用と言うより、
ログ代わりで使うと良いと思います。
また、メールサーバがOracleサーバと同じネットワークであると想定して、
PLAIN 認証でログインしています。

拡張子:
PROCEDURE SEND_MAIL
(
	PM_SERVER IN VARCHAR2
	,PM_PORT IN PLS_INTEGER
	,PM_USER IN VARCHAR2
	,PM_PASS IN VARCHAR2
	,PM_TO IN VARCHAR2
	,PM_FROM IN VARCHAR2
	,PM_SUBJECT IN VARCHAR2
	,PM_BODY IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	con UTL_SMTP.CONNECTION;
	ret UTL_SMTP.reply;

/**********************************************************/
/* 内部プロシージャ */
/**********************************************************/
PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2)
AS
BEGIN
	UTL_SMTP.WRITE_DATA(con, name || ': ' || header || UTL_TCP.CRLF);
END;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	con := UTL_SMTP.OPEN_CONNECTION(PM_SERVER,PM_PORT,60);
	UTL_SMTP.EHLO(con, 'localhost');

	ret := UTL_SMTP.COMMAND(
		con,
		'AUTH',
		'PLAIN ' || 
		UTL_ENCODE.TEXT_ENCODE(
			chr(0)||PM_USER||chr(0)||PM_PASS,null,1
		)
	);
	DBMS_OUTPUT.PUT_LINE(ret.text);

	UTL_SMTP.MAIL(con, PM_FROM);
	UTL_SMTP.RCPT(con, PM_TO);

	UTL_SMTP.OPEN_DATA(con);

	send_header('From', '<'||PM_FROM||'>');
	send_header('To', '<'||PM_TO||'>');
	send_header('Date', TO_CHAR(
		sysdate,
		'Dy, dd Mon yyyy HH24:MI:SS',
		'NLS_DATE_LANGUAGE = AMERICAN')||' +0900'
	);

	send_header('Subject', 
		UTL_ENCODE.MIMEHEADER_ENCODE(PM_SUBJECT,'UTF8',1) );
	send_header('content-type', 
		'text/plain; charset=utf-8' );
	send_header('content-transfer-encoding', 
		'base64' );

	UTL_SMTP.WRITE_DATA(con, UTL_TCP.CRLF || 
		UTL_ENCODE.TEXT_ENCODE(PM_BODY,'UTF8',1) );
	UTL_SMTP.CLOSE_DATA(con);

	UTL_SMTP.QUIT(con);

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
	BEGIN
		DBMS_OUTPUT.PUT_LINE(
		'メール送信でエラー:'||SQLCODE||':'||SQLERRM);
		UTL_SMTP.QUIT(con);
	EXCEPTION
		WHEN
		   UTL_SMTP.TRANSIENT_ERROR OR
		   UTL_SMTP.PERMANENT_ERROR THEN
			DBMS_OUTPUT.PUT_LINE(
			'QUITが失敗しました:'||SQLCODE||':'||SQLERRM);
	END;
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
CSV 出力 ( No.11 )
日時: 2009/06/24 23:05
名前: lightbox
拡張子:
方法はいろいろありますが、Express Edition ならオリジナルの WEB インターフェイス
で普通に出力できます。
今度、エンタープライズ・マネージャで探してみますが、いずれにしても
エンタープライズ・マネージャは、通常敷居が高すぎるので、お勧めではありません。

一番簡単なのは、SQLPlus を利用する方法です。
   SQLPlus で CSV 出力
拡張子:
1) 列名リストを作成
拡張子:
郵便番号,都道府県名,市区町村名,町域名
2) エディタで ",""||','||" に置換する
拡張子:
郵便番号||','||都道府県名||','||市区町村名||','||町域名
3) 以下のようなファイルを作成    sample_01.sql
拡張子:
SET LINESIZE 32767
SET PAGESIZE 0
SET TRIMSPOOL ON
SET FEEDBACK OFF
SET TERMOUT OFF
SPOOL 郵便番号マスタ.csv
select 郵便番号||','||都道府県名||','||市区町村名||','||町域名 from 郵便番号マスタ;
SPOOL OFF
EXIT
※ SET PAGESIZE 0 : 書式設定情報をすべて非表示 ※ SET TRIMSPOOL ON : 各行の終わりの空白を削除 ※ SET FEEDBACK OFF : メッセージを表示しない ※ SET TERMOUT OFF : 画面に表示しない 4) sqlplus の実行
拡張子:
sqlplus LIGHTBOX/LIGHTBOX@//night/XE @sample_01
コマンドリファレンス コマンドライン
拡張子:
当然、プログラムが書けるならば、もっと汎用性の高いものが作れますが、
ちょっと欲しいだけなら、VBScript(WSH) がおすすめ。
自分の環境と対象テーブルをエディタで書き換えて、エクスプローラからダブルクリックするだけです。
( 出力 SQL は高速な ||','|| 方式です )
   oracle_csv.vbs
拡張子:
' **********************************************************
' オブジェクト作成
' **********************************************************
Set Cn = CreateObject( "ADODB.Connection" )
Set Rs = CreateObject( "ADODB.Recordset" )
Set Fs = CreateObject( "Scripting.FileSystemObject" )

strDriver = "{Microsoft ODBC for Oracle}"
strServer = "night/xe"
strUser = "lightbox"
strPass = "lightbox"

strTable = "郵便番号マスタ"

ConnectionString = _
	"Provider=MSDASQL" & _
	";Driver=" & strDriver & _
	";Server=" & strServer & _
	";UID=" & strUser & _ 
	";PWD=" & strPass & _ 
	";" 

' **********************************************************
' 接続
' **********************************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 列情報取得
' **********************************************************
Query = "select * from USER_TAB_COLUMNS"
Query = Query & " where TABLE_NAME = '" & strTable & "'"
Query = Query & " order by COLUMN_ID"

on error resume next
Rs.Open Query, Cn
if Err.Number <> 0 then
	Cn.Close
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

Query = "select "
CsvTitle = ""
Do While not Rs.EOF
	if CsvTitle <> "" then
		Query = Query & "||','||"
		CsvTitle = CsvTitle & ","
	end if
	Query = Query & Rs.Fields("COLUMN_NAME").Value
	CsvTitle = CsvTitle & Rs.Fields("COLUMN_NAME").Value
	Rs.MoveNext
Loop
Query = Query & " from " & strTable
Rs.Close

' **********************************************************
' データ取得用クエリー
' **********************************************************
on error resume next
Rs.Open Query, Cn
if Err.Number <> 0 then
	Cn.Close
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

' **********************************************************
' 出力ファイルオープン
' **********************************************************
Set Csv = Fs.CreateTextFile( strTable & ".csv", True )

' **********************************************************
' タイトル出力
' **********************************************************
Csv.WriteLine CsvTitle

' **********************************************************
' データ出力
' **********************************************************
Do While not Rs.EOF
	Csv.WriteLine Rs.Fields(0).Value
	Rs.MoveNext
Loop

' **********************************************************
' ファイルクローズ
' **********************************************************
Csv.Close

' **********************************************************
' レコードセットクローズ
' **********************************************************
Rs.Close

' **********************************************************
' 接続解除
' **********************************************************
Cn.Close

' **********************************************************
' オブジェクト解放
' **********************************************************
Set Fs = Nothing
Set Rs = Nothing
Set Cn = Nothing

Wscript.Echo "処理が終了しました"
↓OO4O を使用した単純な CSV 出力 http://winofsql.jp/VA003334/oracle051009005233.htm ↓Express Edition のWEBツール
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
別スキーマ間のテーブルコピー ( No.12 )
日時: 2008/07/12 16:45
名前: lightbox
拡張子:
ユーザーが SELECT ANY TABLE 権限 を持っておれば、Oracle 接続内で実行すれば
良い事なのですが、ユーザーが自分のスキーマしか見れない場合の特殊な方法です。

この方法は、Oracle の為だけにあるのでは無くいろいろな使い方ができますが、
Oracle で使う場合に注意すべき事がありますし、将来確実に動くがどうかも定かではありません

詳細な解説は後にまわすとして、実際に簡単に実現する方法から説明します。
ここから SQLの窓 Build C++ をダウンロードします そして、解凍して WinOfSql.exe を実行して下さい。 次に、ツールバーの「O」ボタンをクリックして、 そこにある「ODBC アドミニストレータ」ボタンをクリックして下さい そこから、Microsoft ODBC for Oracle を使用して、DSN を二つ作成します ( 名前が二つ必要なだけなので、接続先は同じで良いです ) それぞれの接続を別々の二つのユーザで確認し、 さらに以下の SQL で、SELECT ANY TABLE 権限 が無い事を確認します ( ※ どちらかに、SELECT ANY TABLE 権限 があるとエラーになります、その場合は後述する方法で実行可能です )
拡張子:
select PRIVILEGE 
 from USER_SYS_PRIVS

 union

select PRIVILEGE 
 from ROLE_SYS_PRIVS 

 order by PRIVILEGE
もし、存在したら、SYSTEM ユーザから以下の SQL で削除して下さい。
拡張子:
revoke SELECT ANY TABLE from ユーザー
※ ロールで付与されている場合は、ロールから削除する必要がありますが、他への影響に注意して下さい 次に、コピー元のユーザを「COPY_IN」のDSN から開いて、コピーしたいテーブルを複数選択します メニューより「処理」=>「エクスポート」=>「Oracle」を選びます
拡張子:
● 接続を出力先にします
( 出力先に同名テーブルがあると、追加処理用の確認ダイアログが表示されます )
● 必要であれば、チェックボックスで出力先に主キーを付加するように指示します
拡張子:
これで、普通のテーブルであればコピーされるたと思いますが、この方法では
テーブル作成は、SQLの窓が行っていますし、片方のユーザーまたは両方のユーザーで
SELECT ANY TABLE 権限があるとエラーになります。

そこで、次のセクションでは 上記処理の 元々の SQL を書いて実行する方法を説明します
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
MDB 接続で書く別スキーマ間のテーブルコピーの為のSQL ( No.13 )
日時: 2008/07/12 17:03
名前: lightbox
この記事は、こちらの続きとして書かれています

拡張子:
この方法は、ADO の Microsoft.Jet.OLEDB.4.0 にテーブルをコピーさせる方法です。
まず、SQL の窓のツールバーより「A」ボタンをクリックして以下の場所の MDB を開いて下さい
拡張子:
(winofsql.exeがあるディレクトリ)\Tool\parts\販売管理B.mdb
( MDB ならばなんでも良いです ) そして、以下のようなコピー用のSQLを作成して、テキストエリアにセットし、テキストエリアの 左下にある実行ボタンで実行して下さい。
拡張子:
select * 
into [ODBC;DSN=COPY_OUT;UID=ora01;PWD=ora01].[社員マスタ]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[社員マスタ]
ここで、注意するべきは、実行前に COPY_OUT 側で社員マスタが存在しない事です。 存在している場合はエラーになります。もし、追加処理を行いたい場合は insert into 〜 select * from 〜 の構文を使います。 また、当然ですが、作成されたテーブルに主キーは存在しません。
拡張子:
最も重要なのは、二つの DSN を使用しなければならない事と、
ユーザが SELECT ANY TABLE 権限を持たない事です
では、もし片方の( ここでは、lightbox )が、SELECT ANY TABLE 権限を持っているとした場合、 上記記述が以下のように変化します。
拡張子:
select * 
into [ODBC;DSN=COPY_OUT;UID=ora01;PWD=ora01].[社員マスタ]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
こうしなければならない理由は、Microsoft にまかせると、SELECT ANY TABLE 権限を持った ユーザーでは、Oracle 全体で同名のテーブルがあると、テーブルを特定できずにエラー となるからです。その場合は上記のようにスキーマで修飾しなければなりません。 ですから、上記処理で lightbox. をつけなくても「たまたま」うまくいく場合がありますが、 それは、たまたま他のスキーマに同名のテーブルが無かったからという事になります
拡張子:
いずれにしても、Microsoft.Jet.OLEDB.4.0 を使った MDB 接続上では、
いろいろな他の RDBMS と同時接続して、あたかも MDB 内に全てあるかのように
結合したりする事もできます。( SQLServer と Oracle のテーブルを結合等 )

また、当然ですが、Microsoft.Jet.OLEDB.4.0 は Microsoft の 製品と親和性が高いので
Excel や MDB へのデータエクスポートは容易です
Oracle のデータを Excel へ出力
拡張子:
select * 
into [Excel 8.0;DATABASE=C:\TMP\EXPORT001.xls].[社員マスタ] 
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
ダンプファイルから、別スキーマへテーブルコピー ( No.14 )
日時: 2008/07/23 17:01
名前: lightbox
拡張子:
実際問題環境の移動はこの方法が最も一般的ですが、Oracle を良く知っていないとなかなかうまく
行かなかったりしますのであまりおすすめではありませんが、テーブル単位ならば
もし失敗しても被害が少ないので知っておいてもいいと思います。
imp.par
拡張子:
DIRECTORY=MYDIR
DUMPFILE=ORA01.dmp
TRANSFORM=SEGMENT_ATTRIBUTES:n
REMAP_SCHEMA=ORA01:JET
TABLES=社員マスタ,商品マスタ
TABLE_EXISTS_ACTION=REPLACE
※ ORA01 でエクスポートされたテーブルを JET というスキーマ環境に作成します このパラメータファイルは、テーブルを常に置き換えるので、テストで書き換えられた テーブルをリセットするのに使うと良いと思います。 注意 この処理は SYSTEM ユーザで行って下さい。 もし SYSTEM ユーザが使え無いのであれば、この方法以外を考えたほうが良いと思います。
拡張子:
impdp system/manager@//night/XE PARFILE=imp.par
TABLE_EXISTS_ACTION には他にも以下のようなものがあります
拡張子:
SKIP: 表はそのままにして、次のオブジェクトに移動します。
(CONTENTパラメータがDATA_ONLYに設定されている場合、このオプションは無効です。)

APPEND: ソースから行をロードし、既存の行は変更しません。

TRUNCATE: 既存の行を削除した後、ソースから行をロードします。
ちなみに、以下の PARFILE で CREATE 文を出力すると、スキーマ名が JET になっています
拡張子:
DIRECTORY=MYDIR
DUMPFILE=ORA01.dmp
TRANSFORM=SEGMENT_ATTRIBUTES:n
REMAP_SCHEMA=ORA01:JET
TABLES=社員マスタ,商品マスタ
SQLFILE=MYDIR:ddl.txt
拡張子:
-- CONNECT SYSTEM
-- new object type path is: SCHEMA_EXPORT/TABLE/TABLE
CREATE TABLE "JET"."商品マスタ" 
   (	"商品コード" VARCHAR2(4), 
	"商品名" VARCHAR2(75), 
	"在庫評価単価" NUMBER, 
	"販売単価" NUMBER, 
	"商品分類" VARCHAR2(3), 
	"商品区分" VARCHAR2(1), 
	"作成日" DATE, 
	"更新日" DATE, 
	"備考" VARCHAR2(2000), 
	"削除フラグ" VARCHAR2(1)
   ) ;
 
CREATE TABLE "JET"."社員マスタ" 
   (	"社員コード" VARCHAR2(4), 
	"氏名" VARCHAR2(50), 
	"フリガナ" VARCHAR2(50), 
	"所属" VARCHAR2(4), 
	"性別" NUMBER(1,0), 
	"作成日" DATE, 
	"更新日" DATE, 
	"給与" VARCHAR2(255), 
	"手当" VARCHAR2(255), 
	"管理者" VARCHAR2(4), 
	"生年月日" DATE
   ) ;
 
-- new object type path is: SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
ALTER TABLE "JET"."商品マスタ" ADD PRIMARY KEY ("商品コード") ENABLE;
 
ALTER TABLE "JET"."社員マスタ" ADD PRIMARY KEY ("社員コード") ENABLE;
Data Pump Import
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
複数のSQLを一括で実行するスクリプト( Oracle 接続 ) ( No.15 )
日時: 2008/07/15 21:05
名前: lightbox
拡張子:
このスクリプトを使用しなくても、それ以上の結果を sqlplus で得る事ができます。
区切り文字が、SQL 内で使用されている場合は、そこで SQL が分割されてしまうので、
その場合は、使用者が意図的に区切り文字を "/" 以外に変更して運用する必要があります

このスクリプトの価値は、実際にスクリプトを書ける人が応用できる場合に限られます。

但し、MDB 接続 はかなり違った事ができるので、その同等のスクリプトのサンプルとして
参考にして下さい
execute.vbs
拡張子:
' **********************************************************
' 使用方法
' cscript.exe execute.vbs 対象SQLの書かれたファイルのパス
' **********************************************************
' **********************************************************
' SQLコマンド分割文字
' **********************************************************
strDelimiter = "/"
' **********************************************************
' 接続文字列作成
' **********************************************************
ConnectionString = "Provider=MSDASQL;" & _
"Driver={Microsoft ODBC for Oracle};" & _
"SERVER=PED0-034/ORCL;" & _
"UID=lightbox;" & _
"PWD=lightbox"

Set WshShell = CreateObject("WScript.Shell")
if WScript.Arguments.Count <> 0 then
	ScriptPath = WScript.Arguments(0)
else
	MsgBox "SQL が書かれたテキストへのパスを指定して下さい   "
	Wscript.Quit
end if

if Trim(ConnectionString) = "" then
	MsgBox "対象 RDBMS に接続して接続文字列を取得して下さい   "
	Wscript.Quit
end if

if vbOk <> MsgBox( "対象ファイルは " & ScriptPath & " です" & vbCrLf & vbCrLf & _
	"実行前に現在の接続文字列を確認して下さい->   " & _
	vbCrlf & vbCrLf & ConnectionString, vbOkCancel ) then
	Wscript.Quit
end if

' **********************************************************
' オブジェクト作成
' **********************************************************
Set Fs = CreateObject("Scripting.FileSystemObject")
Set Cn = CreateObject( "ADODB.Connection" )

' **********************************************************
' 接続
' **********************************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	Wscript.echo Err.Description
	Wscript.quit
end if
on error goto 0

' **********************************************************
' 読み出し
' **********************************************************
Set fp = Fs.OpenTextFile( ScriptPath, 1 )
strCommand = " "
nCommand = 0
Do While fp.AtEndOfStream <> True
   Buff = fp.ReadLine
   if not Left( Trim( Buff ), 2 ) = "--" then
      aCommand = Split(strCommand,strDelimiter)
      if Ubound( aCommand ) <> 0 then
         if Trim(aCommand(0)) <> "" then
            on error resume next
            nCommand = nCommand + 1
            if nCommand mod 1000 = 0 then
               Call WshShell.LogEvent( 4, _
                "ADOによる更新SQLのバッチ実行 : " & _
               nCommand & " 件の処理が終了しました" )
            end if
            Wscript.Echo nCommand & ":" & aCommand(0)
            Cn.Execute aCommand(0)
            if Err.Number <> 0 then
               Wscript.Echo nCommand & ":ERR:" & Err.Description
            end if
            on error goto 0
         end if
         For i = 1 to Ubound( aCommand )
            if i = 1 then
               strCommand = aCommand(i)
            else
               strCommand = strCommand & strDelimiter & aCommand(i)
            end if
         Next
      end if
      strCommand = strCommand & vbCrLf & Buff
   end if
Loop
fp.Close

aCommand = Split(strCommand,strDelimiter)
For i = 0 to Ubound( aCommand )
   if Trim(Replace(aCommand(i),vbCrLf,"")) <> "" then
      on error resume next
      nCommand = nCommand + 1
      Wscript.Echo nCommand & ":" & aCommand(i)
      Cn.Execute aCommand(i)
      if Err.Number <> 0 then
         Wscript.Echo  nCommand & ":ERR:" & Err.Description
      end if
      on error goto 0
   end if
Next

' **********************************************************
' 接続解除
' **********************************************************
Cn.Close

MsgBox ScriptPath & vbCrLf & "を使用した更新 SQL のバッチ実行が終了しました   "
実行サンプルテキスト
拡張子:
create table 社員テスト1
as
select * from 社員マスタ
/
create table 社員テスト2
as
select * from 社員マスタ
/
create table 社員テスト3
as
select * from 社員マスタ
/
実行サンプル
拡張子:
C:\user\lightbox\Oracle>cscript execute.vbs update_test.sql
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

1:
create table 社員テスト1
as
select * from 社員マスタ

2:
create table 社員テスト2
as
select * from 社員マスタ

3:
create table 社員テスト3
as
select * from 社員マスタ

C:\user\lightbox\Oracle>
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
複数のSQLを一括で実行するスクリプト( MDB 接続 ) ( No.16 )
日時: 2008/07/15 21:55
名前: lightbox
拡張子:
こちら で紹介した SQL を複数実行する為の便利なスクリプトです。

MDB は スクリプトと同じディレクトリに dummy.mdb というファイルを作成して使用します。
( 終了時には削除しませんが、再度実行時には事前に削除します )
execute_mdb.vbs
拡張子:
' **********************************************************
' 使用方法
' cscript.exe execute.vbs 対象SQLの書かれたファイルのパス
' **********************************************************
' **********************************************************
' SQLコマンド分割文字
' **********************************************************
strDelimiter = "/"
' **********************************************************
' MDB 接続用の dummy.mdb 作成
' **********************************************************
Set Fs = CreateObject( "Scripting.FileSystemObject" )
Set Adox = CreateObject( "ADOX.Catalog" )
strCurPath = WScript.ScriptFullName
Set obj = Fs.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path
strTarget = strCurPath & "\dummy.mdb"
on error resume next
Fs.DeleteFile( strTarget )
on error goto 0
ConnectionString = _
	"Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source=" & strTarget & ";"
on error resume next
Adox.Create ConnectionString
if Err.Number <> 0 then
	WScript.Echo Err.Description
	WScript.Quit
end if
on error goto 0
Set Adox = Nothing

' **********************************************************
' 接続文字列作成
' **********************************************************
ConnectionString = _
	"Provider=Microsoft.Jet.OLEDB.4.0;" & _
	"Data Source=" & strTarget & ";"

Set WshShell = CreateObject("WScript.Shell")
if WScript.Arguments.Count <> 0 then
	ScriptPath = WScript.Arguments(0)
else
	MsgBox "SQL が書かれたテキストへのパスを指定して下さい   "
	Wscript.Quit
end if

if Trim(ConnectionString) = "" then
	MsgBox "接続文字列を指定して下さい   "
	Wscript.Quit
end if

if vbOk <> MsgBox( "対象ファイルは " & ScriptPath & " です" & vbCrLf & vbCrLf & _
	"実行前に現在の接続文字列を確認して下さい->   " & _
	vbCrlf & vbCrLf & ConnectionString, vbOkCancel ) then
	Wscript.Quit
end if

' **********************************************************
' オブジェクト作成
' **********************************************************
Set Cn = CreateObject( "ADODB.Connection" )

' **********************************************************
' 接続
' **********************************************************
on error resume next
Cn.Open ConnectionString
if Err.Number <> 0 then
	Wscript.echo Err.Description
	Wscript.quit
end if
on error goto 0

' **********************************************************
' 読み出し
' **********************************************************
Set fp = Fs.OpenTextFile( ScriptPath, 1 )
strCommand = " "
nCommand = 0
Do While fp.AtEndOfStream <> True
   Buff = fp.ReadLine
   if not Left( Trim( Buff ), 2 ) = "--" then
      aCommand = Split(strCommand,strDelimiter)
      if Ubound( aCommand ) <> 0 then
         if Trim(aCommand(0)) <> "" then
            on error resume next
            nCommand = nCommand + 1
            if nCommand mod 1000 = 0 then
               Call WshShell.LogEvent( 4, _
                "ADOによる更新SQLのバッチ実行 : " & _
               nCommand & " 件の処理が終了しました" )
            end if
            Wscript.Echo nCommand & ":" & aCommand(0)
            Cn.Execute aCommand(0)
            if Err.Number <> 0 then
               Wscript.Echo nCommand & ":ERR:" & Err.Description
            end if
            on error goto 0
         end if
         For i = 1 to Ubound( aCommand )
            if i = 1 then
               strCommand = aCommand(i)
            else
               strCommand = strCommand & strDelimiter & aCommand(i)
            end if
         Next
      end if
      strCommand = strCommand & vbCrLf & Buff
   end if
Loop
fp.Close

aCommand = Split(strCommand,strDelimiter)
For i = 0 to Ubound( aCommand )
   if Trim(Replace(aCommand(i),vbCrLf,"")) <> "" then
      on error resume next
      nCommand = nCommand + 1
      Wscript.Echo nCommand & ":" & aCommand(i)
      Cn.Execute aCommand(i)
      if Err.Number <> 0 then
         Wscript.Echo  nCommand & ":ERR:" & Err.Description
      end if
      on error goto 0
   end if
Next

' **********************************************************
' 接続解除
' **********************************************************
Cn.Close

MsgBox ScriptPath & vbCrLf & "を使用した更新 SQL のバッチ実行が終了しました   "
実行サンプルテキスト
拡張子:
select * 
into [ODBC;DSN=COPY_OUT;UID=ora_01;PWD=ora_01].[社員マスタ1]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
/
select * 
into [ODBC;DSN=COPY_OUT;UID=ora_01;PWD=ora_01].[社員マスタ2]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
/
select * 
into [ODBC;DSN=COPY_OUT;UID=ora_01;PWD=ora_01].[社員マスタ3]
from 
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
実行サンプル
拡張子:
C:\user\lightbox\Oracle>cscript execute_mdb.vbs oracle_in_mdb.sql
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

1:
select *
into [ODBC;DSN=COPY_OUT;UID=ora_01;PWD=ora_01].[社員マスタ1]
from
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]

2:
select *
into [ODBC;DSN=COPY_OUT;UID=ora_01;PWD=ora_01].[社員マスタ2]
from
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]

3:
select *
into [ODBC;DSN=COPY_OUT;UID=ora_01;PWD=ora_01].[社員マスタ3]
from
[ODBC;DSN=COPY_IN;UID=lightbox;PWD=lightbox].[lightbox.社員マスタ]
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
PL/SQL で表定義のSQLを取得 ( No.17 )
日時: 2008/07/23 17:02
名前: lightbox
拡張子:
エクスポートで出力したダンプファイルより作成します。
基本的には、Data Pump Import ユーティリティ で行う表定義を取得と同じです 

スキーマ表現を変更したい場合のオプションは、後でエディタで変更できるので
特に必要ありませんが、インポート処理をそのユーザで行いたい場合は、
select * from USER_ROLE_PRIVS で権限を確認して( たいてい無いので )
SYSTEM でログインして権限を付与する必要があります
( コマンドプロンプトから impdp を実行する場合は、SYSTEM でログインするのが通常です )
※ ロールの一覧は select * from DBA_ROLES
拡張子:
PROCEDURE DATAPUMP_SQL_FILE

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	J_HANDLE NUMBER;
	J_STS VARCHAR2(20);
/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	/***************************/
	/* OPEN */
	/***************************/
	J_HANDLE := DBMS_DATAPUMP.OPEN(
		'SQL_FILE'
		,'TABLE'
		,NULL
		,NULL
		,'COMPATIBLE'
		,DBMS_DATAPUMP.KU$_COMPRESS_METADATA
	);

	/***************************/
	/* 入力ファイル */
	/***************************/
	DBMS_DATAPUMP.ADD_FILE(
		J_HANDLE
		,'TABLE_BACKUP_TEST.ORA'
		,'MYDIR'
		,NULL
		,DBMS_DATAPUMP.KU$_FILE_TYPE_DUMP_FILE
	);

	/***************************/
	/* 出力ファイル */
	/***************************/
	DBMS_DATAPUMP.ADD_FILE(
		J_HANDLE
		,'TABLE_BACKUP_TEST.SQL'
		,'MYDIR'
		,NULL
		,DBMS_DATAPUMP.KU$_FILE_TYPE_SQL_FILE
	);

	/***************************/
	/* 出力オプション */
	/***************************/
	DBMS_DATAPUMP.METADATA_TRANSFORM(
		J_HANDLE
		,'SEGMENT_ATTRIBUTES'
		,0
		,NULL
	);

	/***************************/
	/* スキーマ表現を変更したい場合 */
	/* 但し以下の権限が必要 */
	/* IMP_FULL_DATABASE ロール */
	/***************************/
	DBMS_DATAPUMP.METADATA_REMAP (
		J_HANDLE
		,'REMAP_SCHEMA'
		,'ORA_01'
		,'JET'
		,NULL
	);

	/***************************/
	/* SQL 式で スキーマを指定 */
	/***************************/
	DBMS_DATAPUMP.METADATA_FILTER(
		J_HANDLE
		,'SCHEMA_EXPR'
		,'IN (''ORA_01'')'
	);

	/***************************/
	/* SQL 式で 表を指定 */
	/***************************/
	DBMS_DATAPUMP.METADATA_FILTER(
		J_HANDLE
		,'NAME_EXPR'
		,'IN (''社員マスタ'',''商品マスタ'')'
	);

	/***************************/
	/* 開始 */
	/***************************/
	DBMS_DATAPUMP.START_JOB(
		J_HANDLE
		,0
	);

	/***************************/
	/* JOB 終了まで待機 */
	/***************************/
	DBMS_DATAPUMP.WAIT_FOR_JOB(
		J_HANDLE
		,J_STS
	);

	/***************************/
	/* 終了ステータスの表示 */
	/***************************/
	DBMS_OUTPUT.PUT_LINE('処理終了:'||J_STS);

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
Oracle ドキュメント : DBMS_DATAPUMP
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
オンラインで CSV を出力する【IEのみ】 ( No.18 )
日時: 2008/07/28 16:41
名前: lightbox



拡張子:
必要な情報を入力して送信ボタンをクリックすると、Oracle から CSV を出力する為の
VBScript をダウンロードします。

入力された情報は、1ケ月間クッキーで保持されます
( 環境が変わっても再利用可能にするには、WEB 側に保存して認証で取り出すようにすれば良いでしょう )

これは、本来自分が管理するサイトに置いて、ダウンロードせずに「開く」
で即実行する為のものです。

以下のページにソースコードがありますので、参照して下さい
http://winofsql.jp/VA003334/phpVarious080726145257.htm

これは、きちんとシステム化すれば、運用に必要な処理を事前登録できるようにして、
出先での作業を軽減できると思います。
このアーティクルの参照用URLをクリップボードにコピー メンテナンス