简体   繁体   English

如何将sqlplus中受影响的行数返回到Shell脚本?

[英]How can I return the number of rows affected in sqlplus to a shell script?

Here is my shell script: 这是我的shell脚本:

# Deletes data from the 'sample' table starting August 30, 2011.
# This is done in stages with a 7 second break every 
# 2 seconds or so to free up the database for other users. 
# The message "Done." will be printed when there are 
# no database entries left to delete.

user="*****"
pass="*****"
while(true); do
    starttime=`date +%s`
    while [[ $((`date +%s` - $starttime)) -lt 2 ]]; do
        sqlplus $user/$pass@//blabla <<EOF
            whenever sqlerror exit 1
            delete from 
                sample
            where
                sampletime >= to_date('08-30-2011','mm-dd-yyyy') and
                rownum <= 2;
            commit;
EOF
        rows = ???
        if [ $rows -eq 0 ] ; then
        echo "Done."
        exit 0;
    fi
    done
    sleep 7
done

If there is no way to get the number of rows, maybe I can use an error code returned by sqlplus to figure out when to end the script? 如果无法获取行数,也许我可以使用sqlplus返回的错误代码来确定何时结束脚本? Any thoughts? 有什么想法吗?

Thank you! 谢谢!

I'd use sql%rowcount which tells you how many rows were affected by the last DML statement. 我将使用sql%rowcount ,它告诉您最后一个DML语句影响了多少行。

delete from                  
sample             
where                 
sampletime >= to_date('08-30-2011','mm-dd-yyyy') and                 
rownum <= 2;             


if sql%rowcount = 0 then
   dbms_output.put_line('Free');
end if;

commit; 

Kindly use the below Note:-Not tested 请使用以下注:-未测试

user="*****" 
pass="*****" 
while(true); 
do     
starttime=`date +%s`     
while [[ $((`date +%s` - $starttime)) -lt 2 ]]; 
do         
  rows=`sqlplus -silent $user/$pass@//blabla << EOF             
  whenever sqlerror exit 1 
  SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF            
    select count(1) from                  
    sample             
    where                 
    sampletime >= to_date('08-30-2011','mm-dd-yyyy') and                 
    rownum <= 2;             

EOF`         

if [ $rows -neq 0] ; 
then 
    sqlplus $user/$pass@//blabla << EOF1  
    delete  from                  
    sample             
    where                 
    sampletime >= to_date('08-30-2011','mm-dd-yyyy') and                 
    rownum <= 2;             
    commit;
EOF1
else        
echo "Done."         
exit 0;     
fi     
done     
sleep 7 
done 

Please try this: 请尝试以下方法:

                    rows=`sqlplus -s ${DB_USER}/${DB_PASSWD}@${DB_SID} <<EOF
                    delete from sample where sampletime >= to_date('08-30-2011','mm-dd-yyyy') and rownum <= 2;
                    commit;
                    exit;

EOF` fi EOF` fi

            echo rows = $rows 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM