Calling SQL scripts through Shell Script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Calling SQL scripts through Shell Script
# 8  
Old 06-08-2006
Probably this is along the lines of what you want:
WARNING: This is not tested so you assume the risks if you're going to simply paste it into you Load.ksh script.
Code:
USERID=$1
DATA_FILE=$2
CONTROL_FILEA=MetadataA.ctl
CONTROL_FILEB=MetadataB.ctl

IFS=$(echo '\012\001') # Newlines only
for LINE in $(
    sqlplus -s /nolog <<!
        CONNECT ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
        SET FEEDBACK OFF VERIFY OFF ECHO OFF PAGES 0 TRIMSPOOL ON
        COL text FORMAT A150 FOLD_AFTER
        SELECT CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'TRUNCATE TABLE ACXIOM_METADATA_B;'
                    ELSE 'TRUNCATE TABLE ACXIOM_METADATA_A;'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'LoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}'
                    ELSE 'LoadMetadata.ksh ${USERID} ${CONTROL_FILEA} ${DATA_FILE}'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_B'
                    ELSE 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_A'
               END text
        FROM   all_synonyms
        WHERE  synonym_name = 'ACXIOM_METADATA';
!)
do
    case ${LINE} in
        TRUNCATE*|CREATE*)
            sqlplus -s /nolog <<!
connect un/pw
${LINE}
!
 ;;
        LoadMetadata*) exec ${LINE} ;;
    esac
done

This will perform the command in this order:
  1. sqlplus TRUNCATE TABLE ACXIOM_METADATA_B;
  2. LoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}
  3. sqlplus CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_b;
# 9  
Old 06-08-2006
Thank you again Thomas..

I have loaded a sample of 4 rows in to Table B. Switched the synonym to have Table B and then ran the script...

Code:
USERID=$1
DATA_FILE=$2
CONTROL_FILEA=prtnrAcxiomMetadataA.ctl
CONTROL_FILEB=prtnrAcxiomMetadataB.ctl

IFS=$(echo '\012\001') # Newlines only
for LINE in $(
    sqlplus -s /nolog <<!
        CONNECT ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
        SET FEEDBACK OFF VERIFY OFF ECHO OFF PAGES 0 TRIMSPOOL ON
        COL text FORMAT A150 FOLD_AFTER
        SELECT CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'TRUNCATE TABLE PARTNERDBA.ACXIOM_METADATA_B;'
                    ELSE 'TRUNCATE TABLE PARTNERDBA.ACXIOM_METADATA_A;'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}'
                    ELSE 'prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEA} ${DATA_FILE}'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_B'
                    ELSE 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_A'
               END text
        FROM   all_synonyms
        WHERE  synonym_name = 'ACXIOM_METADATA';
!)
do
    case ${LINE} in
        TRUNCATE*|CREATE*)
            sqlplus -s /nolog <<!
connect ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
${LINE}
!
 ;;
        prtnrLoadMetadata*) exec ${LINE} ;;
    esac
done

The script didn't truncate Table B, didn't load Table A and didn't replace the synonym to Table A.

The scripts is easy to understand but I am not sure why it is not executing anything...I wish I would atleast see any messages printing...
# 10  
Old 06-08-2006
Looks like the quotes were getting clobbered. Try moving the SQL into a variable as follows:
Code:
USERID=$1
DATA_FILE=$2
CONTROL_FILEA=prtnrAcxiomMetadataA.ctl
CONTROL_FILEB=prtnrAcxiomMetadataB.ctl

IFS=$(echo '\012\001') # Newlines only
SQL="
        CONNECT ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
        SET FEEDBACK OFF VERIFY OFF ECHO OFF PAGES 0 TRIMSPOOL ON
        COL text FORMAT A150 FOLD_AFTER
        SELECT 
               CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'TRUNCATE TABLE PARTNERDBA.ACXIOM_METADATA_B;'
                    ELSE 'TRUNCATE TABLE PARTNERDBA.ACXIOM_METADATA_A;'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}'
                    ELSE 'prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEA} ${DATA_FILE}'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_B'
                    ELSE 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_A'
               END text
        FROM   all_synonyms
        WHERE  synonym_name = 'ACXIOM_METADATA';
"
for LINE in $(
    sqlplus -s /nolog <<EOF
    ${SQL}
EOF)
do
    case ${LINE} in
        TRUNCATE*|CREATE*)
            sqlplus -s /nolog <<!
connect ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
${LINE}
!
 ;;
        prtnrLoadMetadata*) exec ${LINE} ;;
    esac
done

# 11  
Old 06-08-2006
No Luck Thomas...

Output

Code:
Connected.

0 rows deleted.

Connected.

I changed the TRUNCATE statement to just DELETE...It is not going further down the script to execute the shell script and also switch synonym..

Code:
USERID=$1
DATA_FILE=$2
CONTROL_FILEA=prtnrAcxiomMetadataA.ctl
CONTROL_FILEB=prtnrAcxiomMetadataB.ctl


IFS=$(echo '\012\001') # Newlines only
SQL="
        CONNECT ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
        SET FEEDBACK OFF VERIFY OFF ECHO OFF PAGES 0 TRIMSPOOL ON
        COL text FORMAT A150 FOLD_AFTER
        SELECT
               CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'DELETE PARTNERDBA.ACXIOM_METADATA_B;'
                    ELSE 'DELETE PARTNERDBA.ACXIOM_METADATA_A;'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN '$PARTNER_DB/prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}'
                    ELSE '$PARTNER_DB/prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEA} ${DATA_FILE}'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_B'
                    ELSE 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_A'
               END text
        FROM   all_synonyms
        WHERE  synonym_name = 'ACXIOM_METADATA';
"
for LINE in $(
    sqlplus -s /nolog <<EOF
    ${SQL}
EOF)
do
    case ${LINE} in
        DELETE*|CREATE*)
            sqlplus -s /nolog <<!
connect ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
${LINE}
!
 ;;
        prtnrLoadMetadata*) exec ${LINE} ;;
    esac
done

# 12  
Old 06-08-2006
Check the syntax; it's fairly simple to find the bugs at this point Smilie

1) You changed:
Code:
THEN 'prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}'
ELSE 'prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEA} ${DATA_FILE}'

to:
Code:
THEN '$PARTNER_DB/prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}'
ELSE '$PARTNER_DB/prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEA} ${DATA_FILE}'

therefore, you must change the KSH expression that you are looking for:
Code:
case
...
    $PARTNER_DB/prtnrLoadMetadata*) exec ${LINE} ;;
...
esac

or

case
...
    *prtnrLoadMetadata*) exec ${LINE} ;;
...
esac

2) We both simply missed the missing semicolon here:
Code:
THEN 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_B;'  <===
ELSE 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_A;'  <===

Conclusions:
  1. Korn shell can't guess where all your strings are changing. Make sure that your case statement can actually match the patter returning from sqlplus
  2. SQL must be valid SQL. Check those semicolons.
# 13  
Old 06-08-2006
Thank you very much for the conclusions....I am still learning a whole lot of it...

I have also changed it as per your suggestions...But I think I am going wrong somewhere....It is not recognizing the shell script inside the SQL.

Code:
Connected.

0 rows deleted.

prtnrSynonym.ksh[57]: /partnerdb/bin/prtnrLoadMetadata.ksh dataload prtnrAcxiomMetadataA.:  not found

I tried both ways....

*prtnrLoadMetadata* and $PARTNER_DB/prtnrLoadMetadata*

Code:
USERID=$1
DATA_FILE=$2
CONTROL_FILEA=prtnrAcxiomMetadataA.ctl
CONTROL_FILEB=prtnrAcxiomMetadataB.ctl

IFS=$(echo '\012\001') # Newlines only
SQL="
        CONNECT ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
        SET FEEDBACK OFF VERIFY OFF ECHO OFF PAGES 0 TRIMSPOOL ON
        COL text FORMAT A150 FOLD_AFTER
        SELECT
               CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'DELETE PARTNERDBA.ACXIOM_METADATA_B;'
                    ELSE 'DELETE PARTNERDBA.ACXIOM_METADATA_A;'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN '$PARTNER_DB/prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEB} ${DATA_FILE}'
                    ELSE '$PARTNER_DB/prtnrLoadMetadata.ksh ${USERID} ${CONTROL_FILEA} ${DATA_FILE}'
               END text
              ,CASE WHEN table_name = 'ACXIOM_METADATA_A'
                    THEN 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_B;'
                    ELSE 'CREATE OR REPLACE PUBLIC SYNONYM ACXIOM_METADATA FOR ACXIOM_METADATA_A;'
               END text
        FROM   all_synonyms
        WHERE  synonym_name = 'ACXIOM_METADATA';
"
for LINE in $(
    sqlplus -s /nolog <<EOF
    ${SQL}
EOF)
do
    case ${LINE} in
        DELETE*|CREATE*)
            sqlplus -s /nolog <<!
connect ${DB_USER}/${DB_PASSWORD}@${DB_NAME}
${LINE}
!
 ;;
        $PARTNER_DB/prtnrLoadMetadata*) exec ${LINE} ;;
    esac
done

# 14  
Old 06-08-2006
Sorry, my bad again!

Your line is getting chopped from sqlplus so change:
Code:
SET FEEDBACK OFF VERIFY OFF ECHO OFF PAGES 0 TRIMSPOOL ON

to:

Code:
SET FEEDBACK OFF VERIFY OFF ECHO OFF PAGES 0 TRIMSPOOL ON LINES 300

This gives you enough space for your path and filename. Add more if 300 character isn't enough.

I also changed this:
Code:
        $PARTNER_DB/prtnrLoadMetadata*) exec ${LINE} ;;

to:
Code:
        $PARTNER_DB/prtnrLoadMetadata*) eval ${LINE} ;;

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

[Solved] Calling PL/SQL Block into Shell Script

Hi, i have one simple PL/SQL Block and i have saved it as .sql file, which i am trying to call from UNIX script. PL/SQL block structure CONNECT DB_NAME/PWD@Database whenever SQLERROR EXIT 1; Declare ..Variables... BEGIN --Code-- exception END; exit; I have save this block as... (3 Replies)
Discussion started by: abhii
3 Replies

2. Shell Programming and Scripting

shell script hangs while calling sql file

I have a master shell script which calls some 40 shell scripts. All the shell scripts calls a sql file which executes some sql statements. I run these scripts in parallel such that it saves me time. When i executed them i saw some strange behavior. Firstly, I found that some scripts among the 40... (1 Reply)
Discussion started by: sushi
1 Replies

3. Shell Programming and Scripting

Calling sql file from shell script with parameters.

Hi, I am calling a sql file script.sql from shell script and passing few parameters also as shown below: sqlplus -S id/password @script.sql $param1 $param2 Now,In sql file I have to create a extract text file after querying oracle tables based on the parameters passed(param1,param2) as... (7 Replies)
Discussion started by: anil029
7 Replies

4. Shell Programming and Scripting

calling a sql file in my shell script

Hi, I want to call a sql file in my shell script. see the below code:- if ] then ( isql -U${S_USER} -S${S_SERV} -w100 -b -h0 <<ENDSQL | sed -e "s/Password://" ${S_PWD} set nocount on go use ${S_DB} go // need to call a file name... (16 Replies)
Discussion started by: dazdseg
16 Replies

5. Shell Programming and Scripting

calling 'n' number of shell scripts based on dependency in one shell script.

Hello gurus, I have three korn shell script 3.1, 3.2, 3.3. I would like to call three shell script in one shell script. i m looking for something like this call 3.1; If 3.1 = "complete" then call 3.2; if 3.2 = ''COMPlete" then call 3.3; else exit The... (1 Reply)
Discussion started by: shashi369
1 Replies

6. UNIX for Advanced & Expert Users

Calling sql file from shell script

Hi I have a shell script that call a sql file. The sql file will create a spool file. My requirement is, when ever i get an OS error like file not found. I have to log it in a log file. Could some who worked in a like scenario help me by giving the code sample. Many Thanks.. (1 Reply)
Discussion started by: chintapalli001
1 Replies

7. Shell Programming and Scripting

Calling sql in shell script with parameters

Dear All, I want to call an sql script within a unix shell script. I want to pass a parameter into the shell script which should be used as a parameter in teh sql script. e.g $ ./shell1.sh 5000129 here 5000129 is a prameter inside shell script i am calling one sql script e.g. ... (2 Replies)
Discussion started by: Radhe
2 Replies

8. Shell Programming and Scripting

Calling SQL LDR and SQL plus scripts in a shell script

Hi- I am trying to achieve the following in a script so I can schedule it on a cron job. I am fairly new to the unix environment... I have written a shell script that reads a flat file and loads the data into an Oracle table (Table1) via SQLLDR. This Works fine. Then, I run a nested insert... (5 Replies)
Discussion started by: rajagavini
5 Replies

9. Shell Programming and Scripting

calling sql file from shell script

Hello everybody I need help calling sql file from shell script. Can anyone help me creating a small shell script which calls an sql file . The .sql file should contain some select statements like select emp_no from emp_table; select emp_id from emp_table; And the results should be... (6 Replies)
Discussion started by: dummy_needhelp
6 Replies

10. UNIX for Advanced & Expert Users

Calling PL/SQL Script in Shell Programming

Hi all, In a shell script I need to pass two parameters to a pl/sql script and get the ouput of the pl/sql script and use it in shell script. For example Shell script : test.sh PL/SQL script : get_id.sql parameter1 parameter2 Actually get_id.sql has a select statement something... (1 Reply)
Discussion started by: lijju.mathew
1 Replies
Login or Register to Ask a Question