在shell脚本编写的Create语句中引用动态创建的表名

在shell脚本编写的Create语句中引用动态创建的表名

我需要编写一个脚本来自动生成月末报告。

生成过程涉及在数据库中创建表,然后在同一脚本中访问它们以创建另一个临时表。

我设法动态创建基表,但在使用以前的动态表作为参考创建另一个临时表时遇到问题。

表1:(Create语句位于sql文件中)

Create table XYZ as
(
Select * from abc
);

注意:表 abc 已存在于系统中。因此创建 XYZ 表没有太大问题。

表2:(Create语句在sql文件中)

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

现在,我无法在创建 JKL 时找到访问表 XYZ 的方法。我想过在变量中分配表名 XYZ,但我有很多这样的表要使用不同的表作为参考来创建,所以我认为为每个表名创建单独的变量不是一个有效的想法。

以下是我创建表 1 的 shell 脚本:

#!/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。

如何增强脚本以促进此功能?

相关内容