我可以在Oracle数据库中的异常处理程序中获取SQLSTATE值吗?

我可以在Oracle数据库中的异常处理程序中获取SQLSTATE值吗?,oracle,plsql,Oracle,Plsql,表示Oracle完全支持E171 SQLSTATE 在PostgreSQL中,我可以读取此标准SQL SQLSTATE变量,请参见: 它未被识别: ORA-06550: line 4, column 59: PLS-00201: identifier 'SQLSTATE' must be declared ORA-06550: line 4, column 25: PL/SQL: Statement ignored SQL-92不推荐使用的SQL代码在Oracle中工作: BEGIN DB

表示Oracle完全支持E171 SQLSTATE

在PostgreSQL中,我可以读取此标准SQL SQLSTATE变量,请参见:

它未被识别:

ORA-06550: line 4, column 59:
PLS-00201: identifier 'SQLSTATE' must be declared
ORA-06550: line 4, column 25:
PL/SQL: Statement ignored
SQL-92不推荐使用的SQL代码在Oracle中工作:

BEGIN
  DBMS_OUTPUT.PUT_LINE(1/0);
EXCEPTION
  WHEN ZERO_DIVIDE THEN DBMS_OUTPUT.PUT_LINE('Error: ' || SQLCODE || ' - ' || SQLERRM);
END;
/
我得到:

dbms_output: Error: -1476 - ORA-01476: divisor is equal to zero

如何在Oracle中获取SQLSTATE?

通过JDBC连接,并在出现异常时使用SQLException类的

您可以使用CREATE JAVA SOURCE在Oracle内部执行此操作:

创建并编译名为test_sqlstate_JAVA AS的JAVA源代码 导入java.sql.*; 公共类TestSQLState { 公共静态字符串测试int分子,int分母抛出SQLException { 字符串sql=从双精度中选择?/; 尝试 { Connection conn=DriverManager.getConnectionjdbc:默认:连接:; PreparedStatement pstmt=conn.prepareStatementsql; pstmt.setInt1,分子; pstmt.setInt2,分母; 结果集rset=pstmt.executeQuery; pstmt.close; } 捕获SQLE异常 { 返回e.getSQLState; } 返回null; } } 然后是PL/SQL包装函数:

创建函数测试\u数字中的sqlstate分子,数字中的分母返回VARCHAR2 作为语言JAVA名称“TestSQLState.test int,int返回JAVA.lang.String”; / 然后可以将其作为任何SQL函数调用:

从DUAL中选择test_sqlstate 1,0作为sqlstate; 哪些产出:


dbfiddle

文档对此不是很清楚,但是,它说:

Oracle Database server, release 12.2
OTT (Oracle Type Translator), release 12.2
Pro*C/C++, release 12.2
Pro*COBOL, release 12.2
第一个表示Oracle数据库支持SQLSTATE,另外3个是SQL客户机。但是您使用的是PL/SQL客户机,它没有列出。不幸的是,像PL/SQL、SQL*plus和sqlcl这样的常见Oracle SQL客户机似乎不支持SQLSTATE特性。然而,其他语言JDBC、ODBC的驱动程序通常包括它

如果您真的需要PL/SQL中的SQLSTATE代码,我建议您编写一个函数来将Oracle SQLSTATE映射到SQLSTATEs

dbms_output: Error: -1476 - ORA-01476: divisor is equal to zero
| SQLSTATE | | :------- | | 22012 |
Oracle Database server, release 12.2
OTT (Oracle Type Translator), release 12.2
Pro*C/C++, release 12.2
Pro*COBOL, release 12.2