通过詹金斯管道,如果出现错误ORA-01940: cannot drop a user that is currently connected
,我想执行一些操作。
进行测试,我应该得到该消息。如果我创建用户并使用它登录到sql developer,然后尝试通过管道将其删除,则会导致上述错误-
sh '''
sqlplus -s /nolog <<-EOF
connect system/system@orcl
DROP USER TEST_USER;
exit
EOF
'''
我可以使用该用户进行连接并通过管道将其丢弃,从而导致上述错误吗?
答案 0 :(得分:0)
如果使用外壳程序脚本通过Jenkins中的PIPELINE运行该零件,则有一些选项:
获取操作的特定返回码
在这种情况下,您可以执行以下操作
sh '''
sqlplus -s /nolog <<-EOF
connect system/system@orcl
whenever sqlerror exit 99
DROP USER TEST_USER;
exit
EOF
'''
如果出现错误,此操作将返回99。您必须使用$?
示例
会话1(作为系统)
SQL> create user test identified by Oracle_1 ;
User created.
SQL> grant connect to test ;
Grant succeeded.
我与用户测试连接,然后与系统用户连接,我将尝试删除它
SQL> whenever sqlerror exit 99
SQL> drop user test ;
drop user test
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64 bit Production
[ftpcpl@scglvdoracp0040 ~]$ echo $?
99
使用PLSQL块返回代码或消息
但是,如果您想要的东西与以前的选项不同,例如自动显示代码而不进行评估,那么您可以使用匿名PL / SQL块在输出中显示消息。
在您的情况下,我会使用类似这样的内容:
sh '''
sqlplus -s /nolog <<-EOF
connect system/system@orcl
set serveroutput on feedback off
declare
user_is_conn exception;
verror varchar2(100);
pragma exception_init ( user_is_conn , -1940 );
begin
execute immediate q'[ DROP USER TEST ]';
exception
when user_is_conn then
verror := sqlerrm ; -- the whole error message
-- verror := sqlcode ; -- only the code 1940
dbms_output.put_line(verror); -- message
when others then
raise;
end;
/
exit
EOF
'''
我在前面的部分中评论了verror := sqlcode
,以显示整个消息。在Linux上运行的示例如下:
$ $ORACLE_HOME/bin/sqlplus -S "/ as sysdba" << eof
set serveroutput on feedback off
declare
user_is_conn exception;
verror varchar2(100);
pragma exception_init ( user_is_conn , -1940 );
begin
execute immediate 'DROP USER TEST' ;
exception
when user_is_conn then
verror := sqlerrm ;
dbms_output.put_line(verror);
when others then
raise;
end;
/
eof
ORA-01940: cannot drop a user that is currently connected
请注意,此PL / SQL块已结束。我的意思是,从OS角度来看,操作返回码为0。如果您希望将其作为错误,则需要引发该错误,但是在这种情况下,消息将有所不同。