シェルスクリプトで作成されたCreateステートメントで動的に生成されたテーブル名を参照します。

シェルスクリプトで作成されたCreateステートメントで動的に生成されたテーブル名を参照します。

月末レポートを自動的に生成するスクリプトを作成する必要があります。

ビルドプロセスには、データベースにテーブルを作成し、同じスクリプトからそのテーブルにアクセスして別の一時テーブルを作成することが含まれます。

基本テーブルを動的に作成しましたが、以前の動的テーブルを参照として使用して別の一時テーブルを作成する際に問題があります。

表 1: (Create 文は sql ファイルにあります)

Create table XYZ as
(
Select * from abc
);

注:テーブルabcはシステムにすでに存在しています。したがって、XYZテーブルを作成することは大きな問題ではありません。

表 2: (SQL ファイルにステートメントを作成)

Create table JKL as
(
Select distinct list from XYZ
);

JKLを作成するときにXYZテーブルにアクセスする方法が見つかりませんでした。私は変数にテーブル名XYZを割り当てようとしましたが、他のテーブルを参照として使用して作成するテーブルがたくさんあるため、各テーブル名に対して別々の変数を作成することは有効なアイデアではないと思います。

以下は、表1を生成するシェルスクリプトです。

#!/bin/ksh

#Read the file file_table_map.sql to fetch the sql file name and corresponding table name

#file where the info related to create statement, prefix of table name and DB is stored.

file_table_lst_map=`echo ${abhi_SRC}/file_table_map.lst`

date_prev=`date --d 'last month'  +%b"_"%Y`

RunSQLCMD()
{
echo "Code came here"
echo $file_name
echo $table_name
echo $db_name
sqlplus -s <username>/<password>@${db_name} <<EOF
@$file_name $table_name
EOF
if [ $? -ne 0 ]
then
       echo "Failed to execute ${file_name}"
        return 1
   fi
    echo "Success in executing sqlcmd for ${file_name}"
    return 0
}


cat $file_table_lst_map|while read r
        do
                file_name=`echo $r|awk '{print $1}'`
                tab_name=`echo $r|awk '{print $2}'`
                #prepare the table name to be created
               table_name=$tab_name"_"$date_prev
                db_name=`echo $r| awk '{print$3}'`
                echo "========================================"
                #RunSQLCMD "${file_name}" "${table_name}" "${db_name}"
                #echo $date_prev
                echo " File to be executed - " $file_name "/" "table created - " $table_name "/" "db_name - "$db_name
        done

#echo $table_name

"file_table_map.lst"ファイルの形式は次のとおりです。

<SQL file path and name> <table name prefix> <DB>
abc.sql abc DB_Z

表1を生成するSQLコマンドは次のとおりです。

CREATE TABLE &1 AS
(
SELECT to_char(add_months(SYSDATE,-1),'MON_yyyy') as dat FROM DUAL
);

&1はテーブル名abc_jan_2018です。

create table &1 AS
(
SELECT * FROM &2
)

そのうち、&1はテーブル名JKL_jan_2018、&2はabc_jan_2018です。

この機能を有効にするためにスクリプトをどのように拡張できますか?

ベストアンサー1

おすすめ記事