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
まず、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'
方法はいろいろありますが、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 の実行
' **********************************************************' 使用方法' 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>
' **********************************************************' 使用方法' 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.社員マスタ]