Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

PL/SQL ShellScript

シェルスクリプトからPL/SQLのプロシージャを実行する方法

投稿日:2020年10月21日 更新日:

<目次>

(1) シェルスクリプトからPL/SQLのプロシージャを実行する方法
 (1-1) 処理の概要
 (1-2) サンプルプログラム
  (1-2-1) 呼び出し元:シェルスクリプト側
  (1-2-2) 呼び出し先:PL/SQL側
 (1-3) プログラム実行結果

(1) シェルスクリプトからPL/SQLのプロシージャを実行する方法

(1-1) 処理の概要

表題の通りシェルスクリプトからPL/SQLプロシージャを実行して、DBのテーブルに対するCRUDを行う方法を紹介します。PL/SQLを呼び出せる事で、SQLに対する手続き処理も可能となり、出来る事の幅も広がる可能性があります。

今回紹介するサンプルプログラムは次の図のように、シェルスクリプトからPL/SQLストアドプロシージャを呼び出し、オンラインテーブル「ACCESS_COUNTER」にあるデータを、ヒストリテーブルである「ACCESS_COUNTER_HISTORY」に退避する処理のサンプルプログラムをご紹介します。

(図111)

目次にもどる

(1-2) サンプルプログラム

上記の処理概要の「シェルスクリプト」と「PL/SQLプロシージャ」のプログラムを紹介します。

(1-2-1) 呼び出し元:シェルスクリプト側

(サンプルプログラム)

・「TENNISDBUSR」の箇所はご自身のスキーマ名に置き換えてください。
・「XXX.XXX.XXX.XXX」の部分はIPアドレスやホスト名に置き換えてください。
・「1521/orcl」の部分はご自身のポート番号/SID名に置き換えてください。

#!/bin/sh

#### 環境変数の値をセット(ORACLE_HOME,ORACLE_SID)
#### イコール「=」以降にはご自身の値をセットします(※下記はあくまで例です)
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=orcl

#### Oracleデータベースのユーザー情報を設定
#### 値は上からDBユーザー、DBパスワード、接続文字列です。
l_user='TENNISDBUSR'
l_psw='[ご自身のパスワード]'
l_conn_string='//XXX.XXX.XXX.XXX:1521/orcl'

#### PLSQLプロシージャの第一引数を宣言します。
#### (※シェルスクリプト内の変数として宣言)
var1=''

#### 前半(<<の前まで)でSQL*Plusを起動します。
#### 後半の「<< END」は埋め込みスクリプトの最終地点の文言「END」を予告宣言
#### 埋め込みスクリプトは具体的には、起動したSQL*Plus内で実行するコマンドです。
/u01/app/oracle/product/11.2.0/dbhome_1/bin/sqlplus $l_user/$l_psw@$l_conn_string << END

  #### PLSQLプロシージャの第二引数を宣言します。
  #### (※SQL*Plus内のバインド変数として宣言)
  var var2 varchar2(20);

  #### PLSQLプロシージャを実行します。
  #### SQL*Plusのバインド変数は代入時に前にコロン「:」を付与します(お作法)
  execute TENPKS_UTILS_ACCESS_COUNTER_T('$var1',:var2);

  #### シェルスクリプトの終了
  exit;

#### here-documentの終了地点(ここでSQL*Plusから切断されます)
END

目次にもどる

(1-2-2) 呼び出し先:PL/SQL側

(サンプルプログラム)

create or replace PROCEDURE TENPKS_UTILS_ACCESS_COUNTER_T (var1 IN varchar2, var2 IN OUT varchar2) AS
BEGIN
  --access_counterテーブルのレコード数だけLOOPする
  FOR o IN (select counter_id, function_id, access_count from access_counter)    
  LOOP
    --変数var2に次のINSERT文の条件で使う値を代入
    var2:=o.function_id;
 
    --access_counterテーブルのレコードをACCESS_COUNTER_HISTORYにINSERT
    INSERT INTO ACCESS_COUNTER_HISTORY_TEST (COUNTER_ID,FUNCTION_ID,ACCESS_COUNT,ACCESS_DATE) 
    VALUES (ACCESS_HISTORY_SEQ.NEXTVAL,var2,o.access_count,SYSDATE); 
  END LOOP;
END TENPKS_UTILS_ACCESS_COUNTER_T;

こちらに関しては、シェルスクリプトから呼び出す以前に、単体でちゃんと機能するか?を事前に疎通確認しました(↓動画)
(動画)PL/SQLの単体疎通確認

(動画の流れ)
①ACCESS_COUNTERテーブルをSELECTし、レコードが0件である事を確認
②PL/SQLストアドプロシージャを実行
③ACCESS_COUNTERテーブルを再度SELECTし、今度はレコードが追加されている事を確認

目次にもどる

(1-3) プログラム実行結果

プログラムの実行結果(動画)をご紹介します。

(動画)

(動画の流れ)
①ACCESS_COUNTERテーブルをSELECTし、レコードが0件である事を確認
②シェルスクリプトを実行
③ACCESS_COUNTERテーブルを再度SELECTし、今度はレコードが追加されている事を確認

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-PL/SQL, ShellScript

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Linux – シェルスクリプト入門(Hello World/引数・変数/条件分岐/繰り返し処理)

シェルスクリプトの作成方法について ■目次 (1)シェルスクリプトでHello World (2)シェルスクリプトで変数/引数を使う (3)シェルスクリプトで条件分岐を記述 (4)シェルスクリプトで繰 …

【PL/SQL】”UTL_FILE”パッケージを利用して”.TXT”を読み込む方法

今回はPL/SQLのUTL_FILEパッケージを利用して、サーバ内にあるテキストファイルを読み込むプロシージャを作成したいと思います。 (0) 目次 (1) 事前準備:ディレクトリオブジェクトの作成( …

シェルスクリプトでOracleデータベースに接続する手順+サンプルプログラム

<目次> (1) シェルスクリプトでOracleDBに接続する手順  (1-1) 処理の概要  (1-2) 前半:sqlファイルの作成  (1-3) 後半:シェルスクリプトの作成  (1-4) プログ …

ログインシェルとは?非ログインシェルとの違いも併せてご紹介

<目次> (1) ログインシェルとは?非ログインシェルとの違いも併せてご紹介  (1-1) ログインシェルの概要  (1-2) ログインシェルの役割  (1-3) ログインシェルの動作  (1-4) …

  • English (United States)
  • 日本語
Top