我需要编写一个脚本来自动生成月末报告。
生成过程涉及在数据库中创建表,然后在同一脚本中访问它们以创建另一个临时表。
我设法动态创建基表,但在使用以前的动态表作为参考创建另一个临时表时遇到问题。
表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。
如何增强脚本以促进此功能?