- Yes, that issue has been fixed and it's now reading that file which has username,password and parameters
- Not necessarily but we need the full access for the log file
- In the actual script, i have the correct word but while copying this error had occurred.
- No,it's not returning any code,simply merging statement.
- 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:
Use code tags and other forum tools such as list for better visibility and understanding.
Last edited by Peasant; 12-23-2019 at 03:27 PM..
Reason: Added code tags and list.
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.
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 commandv_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}"
:
:
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
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.
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:
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.
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)
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)
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)
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)
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)
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)
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)