Visit Our UNIX and Linux User Community


Shell script to execute Oracle procedure and trigerring email on success and failure


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Shell script to execute Oracle procedure and trigerring email on success and failure
# 8  
Old 12-23-2019
Hi - Thanks for your reply.
  1. - Yes, that issue has been fixed and it's now reading that file which has username,password and parameters
  2. - Not necessarily but we need the full access for the log file
  3. - In the actual script, i have the correct word but while copying this error had occurred.
  4. - No,it's not returning any code,simply merging statement.
  5. - The actual value of that query is 890(i ran that query alone in the DB)

Yes i tired with that option also it's returning 0.Here i removed the exec proc since i'd like to check the output of the query alone.

Code:
ssqlplus -sn  <<EOF > "$LOG_TEXT"
connect "${ORAUSER}"/"${ORAPASSWD}"@"${ORASRVC}"
set head off
DECLARE
v_count NUMBER;
BEGIN
select count(*) INTO v_count from (select col1,col2,count(col3) from Tab1 group by col1,col2 having count(col3)>1);
END;
EOF
exit  &v_count;
echo$?

Moderator's Comments:
Mod Comment
Use code tags and other forum tools such as list for better visibility and understanding.

Last edited by Peasant; 12-23-2019 at 04:27 PM.. Reason: Added code tags and list.
# 9  
Old 12-23-2019
Since you are using Oracle PL/SQL, it has DBMS Output availability to write to logs and UTL_SMTP to send mails.
Do everything in PL/SQL procedure and make your life easier.

At least, do not use $?, this is an abuse of exit call and will not give results you might think it will.
Valid range is from 0 to 255, with 0 meaning success, everything else (some) type of error.

So using exit code variable filled with count from rows is just wrong, with all those pl/sql database utilities at your disposal.

Hope that helps
Regards
Peasant.
# 10  
Old 12-23-2019
What's the other option to return the value to the shell script and use the same in the IF condition?

Can you please show some examples using UTL_SMTP and UTL_mail to send emails on the success?
# 11  
Old 12-24-2019
Your exit &v_count statement needs to at least be run before the EOF closes the here document else this is left to the shell. It will run the shell exit in the background and then try to run the command v_count, which probably won't be found. It will then confuse you.

I agree with Peasant that this probably isn't the way to go for non-trivial counts. Some shells might let you get away with it, but best to avoid it. Perhaps an SQL statement like prompt "v_count=&v_count" ; might work, but I haven't got a server I can test this statement on at all, so it will probably have an error in it, however if you can generate an obviously tagged output that tell you the value you need to pass, then perhaps you can get at that in the shell script part.

Maybe someone else can jump in here to suggest a clean way to pass the value out. I've got a few options but I'd expect better ones. Given you are writing all the output to a log file, you might get away with:-
Code:
:
:
EOF

v_count_line="$(grep 'v_count='  "${LOG_TEXT}")"            # Grab the crafted line from the output file

v_count="${v_count_line#*=}"          # Set the value in the shell script to be the part of the line after the equals sign by trimming off everything in front (including the equals sign)

printf "The duplicate lines count is %s\n" "${v_count}"
:
:

Like I say, there's probably a better way.
# 12  
Old 12-27-2019
Hi - Apologize for the delayed response. Here is the code which i tired where it passes the value to the shell script(in echo command) but not able to get the variable value in the IF condition. Am getting this output even the query output is 0.But at same time i tried with query with more than 0 records and am getting the output as expected.Since the value has leading spaces the IF condition is not matching with the values. Also i tried withcat test.out| sed -e 's/^[ \t]*//' IF condition works if the value is 0 but not for value>0 it returns with error No such file or dir Can you help me to get the proper trimming command for the values 0 or more than 0(max 4 digits)

Code:
status proc  executed successfully

Num of Duplicate records Found:          0

where the actual output should be

status proc  executed successfully

No Duplicate records Found:          0


Code:
#!/bin/ksh  
outvar=0  
sqlplus -S /nolog <<EOF>test.out  
   "${ORAUSER}"/"${ORAPASSWD}"@"${ORASRVC}"
   set echo off termout off feedback off  
   set pagesize 0  
   set trimspool on  
   select to_char(count(*)) from (select col1,col2,count(col3) from Tab1 group by col1,col2 having count(col3)>1)  
 EOF  
outvar=`cat test.out`  
echo " status proc  executed successfully"  
if [[ $outvar = 0 ]]; then  
   echo "No Duplicate records Found: $outvar"  
else  
   echo "Num of Duplicate records Found: $outvar"  
fi


Last edited by rbatte1; 12-27-2019 at 07:06 AM..
# 13  
Old 12-27-2019
The outvar=`cat test.out` is not great from a few things:-
  • The backticks ` are deprecated and can make complex statements difficult to read. You would be better to wrap such code with $( and )
  • The cat command is a waste of a process. You can just do this - outvar=$(<test.out)

The content of outvar will contain the entire file, so leading spaces, any headers (I see you've turned them off) and any end of line/end of file marker so the numerical comparison is a bit awkward. Your test in [[ & ]] uses the = operator, but this is a string comparison, and I'm not sure if this structure is supported in true ksh either. This is more of a bash syntax. ksh might also accept it, but I think it is only looking for file information instead. Your test (assuming that the file always just contains a numeric value) could probably be written as:
Code:
outvar=$(<test.out)
if [ $outvar -eq 0 ]
then
   echo "No Duplicate records Found: $outvar"  
else  
   echo "Num of Duplicate records Found: $outvar"  
fi

If it gives a bit of trouble, it is likely that the other characters read in from the file are the problem. You might try adding a line after the read such as typeset -i outvar=$outvar to see if that strips all the other things away and just assigns it the integer value. There are various typeset options for true ksh that have not transferred into bash or other pseudo-ksh so I'm hoping you have a true ksh. I can't test the syntax properly because I've not got a true ksh available so this bit is from memory of about 5 years ago.



Do either of these suggestions help?

Robin
This User Gave Thanks to rbatte1 For This Post:
# 14  
Old 12-28-2019
Awesome! It's working as expected now by assigning the variable value in this approach.
Code:
outvar=$(<test.out)
if [ $outvar -eq 0 ]

Moderator's Comments:
Mod Comment
Please wrap all code, data files, input & output/errors in CODE tags.
it makes them easier to read and preserves spaces for indenting or fixed width data.

Last edited by rbatte1; 12-30-2019 at 05:52 AM..

Previous Thread | Next Thread
Test Your Knowledge in Computers #318
Difficulty: Easy
MacOS is based on Linux.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Execute Oracle gather stats via shell script

Hi , I am trying to automate a gather stats in shell script #!/usr/bin/ksh export ORACLE_HOME=/orcl/app/oracle/product/11.2.0.1/db_1 export PATH="$PATH:$ORACLE_HOME/bin" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$ORACLE_HOME/lib32" export TNS_ADMIN=/opt/netprobe/config... (1 Reply)
Discussion started by: neil.k
1 Replies

2. Shell Programming and Scripting

Why i can't execute the procedure in shell script?

i have the following code inside a shell script .prog in oracle server when i call the program DBMS_OUTPUT.PUT_LINE(x_return_status|| ln_rep_req_id); will return 0 , it is very strange , i try to submit the concurrent request in oracle , and it can successfully executed, what am i missing ? i... (1 Reply)
Discussion started by: feilhk
1 Replies

3. Shell Programming and Scripting

Execute a shell script from Oracle procedure

Hi Gurus, Want to execute a shell script from a oracle procedure and get the status of the same, any assistance in this regard will be appreciated. proc_data.sh is script name which I want to execute from oracle procedure It should work something like below procedure test begin... (1 Reply)
Discussion started by: palanisvr
1 Replies

4. Shell Programming and Scripting

How to execute the stored procedure from shell script

How to execute the stored procedure from shell script and is there any possibility to print the dbms output in a log file. (2 Replies)
Discussion started by: dineshmurs
2 Replies

5. Shell Programming and Scripting

Shell Script for call a procedure in Oracle DB

Hi everyone! I'm new with Shell Scripting, and I have to do a shell script to call a procedure, which have 2 input parameters, the directory(from server) and the txt file (which have informations to update/insert in DB). I have to create a shell script to execute that procedure for each txt... (5 Replies)
Discussion started by: renatoal
5 Replies

6. Shell Programming and Scripting

Invoking Oracle stored procedure in unix shell script

Here's a shell script snippet..... cd $ORACLE_HOME/bin Retval=`sqlplus -s <<eof $TPDB_USER/april@$TPD_DBCONN whenever SQLERROR exit 2 rollback whenever OSERROR exit 3 rollback set serveroutput on set pages 999 var status_desc char(200) var status_code... (1 Reply)
Discussion started by: hidnana
1 Replies

7. Shell Programming and Scripting

How to execute an Oracle procedure using shell

Hi , i have created an .sh file that has the following code: #!/bin/ksh sqlplus -s p1istuat/p1istuat@CWS_IST6 @Procedure_Execute.sql & sqlplus -s p1istuat/p1istuat@CWS_IST6 << EOF exit EOF The mentioned Procedure_Execute.sql file inside has the following code: exec TEST; ... (5 Replies)
Discussion started by: vins_san
5 Replies

8. Shell Programming and Scripting

Calling an Oracle Stored Procedure from Unix shell script

hai, can anybody say how to call or to execute an oracle stored procedure in oracle from unix... thanks in advance.... for ur reply.... by, leo (2 Replies)
Discussion started by: Leojhose
2 Replies

9. Shell Programming and Scripting

run shell script from oracle store procedure

hi, this is urgent..can i run a shell script from store procedure without using java. (8 Replies)
Discussion started by: arnabb4u
8 Replies

10. Shell Programming and Scripting

Execute an Oracle stored procedure from a shell scrip

Here is a snippet of my code: if then echo "\n Deleting all reports older than 24 hours. \n" >> $logfile ls -l $FileName >> $logfile ... (1 Reply)
Discussion started by: mh53j_fe
1 Replies

Featured Tech Videos