OSコマンドとSQLPLUSの統合

OSコマンドとSQLPLUSの統合

SQLPLUSをOSコマンドで強化できる!

SQLPLUSのSQL機能はパワーフルだが、OSのgrepやawkなど便利な機能を使いたい、
更にperlと組み合わせたりしたいことはしないか?
osqlfuseのOSのhost統合コマンドはこの機能を実現した。

具体的な仕組みは、
sqlplusの使うまま、OSコマンド
sqlplus/sqlのコマンドの出力をOSのパイプ入力とし、
出力をsqlplusのターミナルで表示する。
また、spool以外sqlplusの環境をほとんど影響しない。

Example:

-- 従来の表示
 
01:37:09 SYS(PROD)> desc dual
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 DUMMY                                                          VARCHAR2(1)
 
-- @host2 "desc dual" "grep D" 利用
-- つまり desc dual の出力を grep D の入力として処理する
 
01:36:54 SYS(PROD)>
01:36:54 SYS(PROD)> @host2 "desc dual" "grep D"
01:37:09 SYS(PROD)> set echo off
 DUMMY                                                          VARCHAR2(1)
01:37:09 SYS(PROD)>
 
-- @host2 "desc dual" "head -n 2" 利用
-- つまり desc dual の出力を head -n 2 の入力として処理する
 
01:50:06 SYS(PROD)>
01:50:06 SYS(PROD)> @host2 "desc dual" "head -n 2"
01:50:31 SYS(PROD)> set echo off
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
01:50:31 SYS(PROD)>

host.sql

set echo off
set termout off
set verify off
set time off
 
-- host.sql
-- osqlfuse package FUS component
-- @author f.yang
-- all rights reserved
-- http://oracle-abc.wikidot.com
--
-- @usage
-- from sqlplus
-- SQL> @host "sql/sqlplus command" "os command"
-- from os shell
-- echo @host '"desc dual"' '"grep D"' | sqlplus -S / as sysdba
--
-- @example
-- from sqlplus
-- SQL> @host "desc dual" "grep DUMMY"
--  DUMMY                                                          VARCHAR2(1)
-- from os shell
-- echo @host '"desc dual"' '"grep D"' | sqlplus -S / as sysdba
--  DUMMY                                                          VARCHAR2(1)
 
spool off
 
spool '.osqlfuse.host.cmd.tmp'
prompt &1
spool off
 
spool '.osqlfuse.host.out.tmp'
@.osqlfuse.host.cmd.tmp
spool off
 
host cat .osqlfuse.host.out.tmp | &2
 
set verify on
set termout on
set time on
set echo on

minimal implementation

-- h.sql
-- osqlfuse. all rights reserved.
set echo off
set termout off
spool off
 
spool '.h.cmd'
prompt &1
spool off
 
spool '.h.out'
@.h.cmd
spool off
 
host cat .h.out | &2
 
set termout on
set echo on

hosttmp.sql

host cat .osqlfuse.host.out.tmp

注意事項!:

  • コマンドのエラー

SQL/SQLPLUSコマンドにエラーがある場合、エラーメッセージは@hosttmpコマンドで確認できる。
OSコマンドにエラーがある場合、直接@hostの出力に出力される

  • spoolへの影響

オラクルの変数機能にいろいろと制限があるため、spoolを活用せざるえなかった。
ということで、従来のsqlplusにspoolが使われた場合、このスクリプト実行するとoffになる。

See Also
integrate os command with sqlplus (English)