脚本不显示 sqlcode
Script doesn't show sqlcode
我有很多 shell 脚本可以在 Oracle 数据库上执行过程和其他任务。通常,它们具有相同的结构,检查 envvars,执行 sql 并使用 show sqlcode
来了解脚本是否成功执行。
这是代码:
#!/bin/bash
# Check for var's in another script
. /home/oracle/cron/scripts/exp_variaveis.sh
$ORACLE_HOME/bin/sqlplus User/pass@database <<!
spool /home/oracle/cron/log/some_name.log_$date_log
set serveroutput on
DECLARE
V_QTD NUMBER;
BEGIN
SELECT COUNT(*) QTD
INTO V_QTD
FROM D.TB_R_A TRA
WHERE TRA.CD_STATUS = 'A'
AND TRA.CD_T_AUT = 'E'
AND TRA.DT_P < TRUNC(SYSDATE);
IF V_QTD = 0 THEN
DBMS_OUTPUT.PUT_LINE('Sem resgates para serem expirados.');
ELSE
FOR R1 IN (SELECT TRA.CD_R, TRA.CD_A, TRA.CD_O
from D.TB_R_A TRA
WHERE TRA.CD_STATUS = 'A'
AND TRA.CD_T_AUT = 'E'
and TRA.DT_P < TRUNC(sysdate))
LOOP
BEGIN
UPDATE D.TB_R_A T
SET T.CD_STATUS = 'E'
WHERE T.CD_R = R1.CD_R;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Resgate expirado: ' || R1.CD_R);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Falha na expiracao do resgate: ' || R1.CD_R);
END;
END LOOP;
END IF;
END;
-- command show slqcode to know if was executed with success
show sqlcode
spool off
exit
!
# A variavel recebe a instrucao de busca do arquivo e se existir reporta o "sqlcode 0" que equilave a "SUCESSO"
sql_code=`grep -i "sqlcode 0" /home/oracle/cron/log/some_name.log_$date_log`
# A variavel trata a instrucao acima e processa os dados nos textos e operacoess com arquivos (awk) mostrando de forma CSV (-F)
# apresentando as strings da segunda coluna '{ print }'
ret_code=`echo $sql_code | awk -F" " '{ print }'`
# Se a variavel $ret_code for diferente de 0
if [ "$ret_code" != 0 ]
then
# Send error message
mail dbajob@domain.com -s "!! ERROR !! CRON => DATABASE - SOME TEXT HERE" < /home/oracle/cron/log/some_name.log_$date_log
exit 1
else
# Send sucessful message
mail dbajob@domain.com -s "Job OK CRON => DATABASE - SOME TEXTE HERE" < /home/oracle/cron/log/some_name.log_$date_log
exit 0
fi
我的问题是:此 sql 不输出 sql 代码,因此如果我的脚本在日志中找不到字符串 "sqlcode",它会发送一条错误消息即使执行成功了。
请告诉我哪里出了问题。
请注意,如 the docs:
中所述,当在异常处理程序之外使用时,SQLCODE 将始终 return 0
SQLCODE
is only useful in an exception handler. Outside a handler, SQLCODE
always returns 0.
但是您甚至看不到 0 输出的原因是您从不执行 PL/SQL 代码块,因此 show
语句不会被识别为立即执行的语句。您需要添加一行 forward slash (/):
/(slash)
Executes the most recently executed SQL command or PL/SQL block which is stored in the SQL buffer.
所以把斜杠放在这里:
END LOOP;
END IF;
END;
/
-- command show slqcode will always show 0.
show sqlcode
我有很多 shell 脚本可以在 Oracle 数据库上执行过程和其他任务。通常,它们具有相同的结构,检查 envvars,执行 sql 并使用 show sqlcode
来了解脚本是否成功执行。
这是代码:
#!/bin/bash
# Check for var's in another script
. /home/oracle/cron/scripts/exp_variaveis.sh
$ORACLE_HOME/bin/sqlplus User/pass@database <<!
spool /home/oracle/cron/log/some_name.log_$date_log
set serveroutput on
DECLARE
V_QTD NUMBER;
BEGIN
SELECT COUNT(*) QTD
INTO V_QTD
FROM D.TB_R_A TRA
WHERE TRA.CD_STATUS = 'A'
AND TRA.CD_T_AUT = 'E'
AND TRA.DT_P < TRUNC(SYSDATE);
IF V_QTD = 0 THEN
DBMS_OUTPUT.PUT_LINE('Sem resgates para serem expirados.');
ELSE
FOR R1 IN (SELECT TRA.CD_R, TRA.CD_A, TRA.CD_O
from D.TB_R_A TRA
WHERE TRA.CD_STATUS = 'A'
AND TRA.CD_T_AUT = 'E'
and TRA.DT_P < TRUNC(sysdate))
LOOP
BEGIN
UPDATE D.TB_R_A T
SET T.CD_STATUS = 'E'
WHERE T.CD_R = R1.CD_R;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Resgate expirado: ' || R1.CD_R);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Falha na expiracao do resgate: ' || R1.CD_R);
END;
END LOOP;
END IF;
END;
-- command show slqcode to know if was executed with success
show sqlcode
spool off
exit
!
# A variavel recebe a instrucao de busca do arquivo e se existir reporta o "sqlcode 0" que equilave a "SUCESSO"
sql_code=`grep -i "sqlcode 0" /home/oracle/cron/log/some_name.log_$date_log`
# A variavel trata a instrucao acima e processa os dados nos textos e operacoess com arquivos (awk) mostrando de forma CSV (-F)
# apresentando as strings da segunda coluna '{ print }'
ret_code=`echo $sql_code | awk -F" " '{ print }'`
# Se a variavel $ret_code for diferente de 0
if [ "$ret_code" != 0 ]
then
# Send error message
mail dbajob@domain.com -s "!! ERROR !! CRON => DATABASE - SOME TEXT HERE" < /home/oracle/cron/log/some_name.log_$date_log
exit 1
else
# Send sucessful message
mail dbajob@domain.com -s "Job OK CRON => DATABASE - SOME TEXTE HERE" < /home/oracle/cron/log/some_name.log_$date_log
exit 0
fi
我的问题是:此 sql 不输出 sql 代码,因此如果我的脚本在日志中找不到字符串 "sqlcode",它会发送一条错误消息即使执行成功了。
请告诉我哪里出了问题。
请注意,如 the docs:
中所述,当在异常处理程序之外使用时,SQLCODE 将始终 return 0
SQLCODE
is only useful in an exception handler. Outside a handler,SQLCODE
always returns 0.
但是您甚至看不到 0 输出的原因是您从不执行 PL/SQL 代码块,因此 show
语句不会被识别为立即执行的语句。您需要添加一行 forward slash (/):
/(slash)
Executes the most recently executed SQL command or PL/SQL block which is stored in the SQL buffer.
所以把斜杠放在这里:
END LOOP;
END IF;
END;
/
-- command show slqcode will always show 0.
show sqlcode