Referenciando nomes de tabela criados dinamicamente em Criar instrução escrita em script de shell

1

Recentemente, recebi uma tarefa para escrever um script para gerar automaticamente um relatório final do mês.

O processo de geração envolveu a criação de tabelas no banco de dados e, em seguida, o acesso posterior no mesmo script para criar outras tabelas temporárias.

Consegui criar a tabela base dinamicamente, mas enfrentei um problema ao criar outra tabela temporária usando a antiga tabela dinâmica como referência.

Vou ilustrar para melhor compreensão:

Tabela 1: (a instrução Create está em um arquivo sql)

Create table XYZ as
(
Select * from abc
);

NOTA: a tabela abc já está presente no sistema. Portanto, não há muito problema em criar a tabela XYZ.

Tabela 2: (a instrução Create está em um arquivo sql)

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

Agora, não consigo encontrar uma maneira de acessar a tabela XYZ ao criar JKL. Eu pensei em atribuir o nome da tabela XYZ em uma variável, mas eu tenho muitas dessas tabelas para serem criadas com tabelas diferentes como referência, então eu não acho que criar uma variável separada para cada nome de tabela seja uma idéia eficiente.

A seguir está meu script de shell para criar a tabela 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

O arquivo "file_table_map.lst" está no seguinte formato

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

O comando SQL para criar a tabela 1 é o seguinte

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

Onde & 1 é o nome da tabela abc_jan_2018

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

em que & 1 é o nome da tabela JKL_jan_2018 e & 2 será abc_jan_2018.

Por favor, informe sobre como melhorar o script para facilitar essa funcionalidade.

    
por A.Bhargava 27.02.2018 / 05:07

0 respostas