【问题标题】:How to catch custom raised exceptions from oracle to java如何捕获从 oracle 到 java 的自定义引发的异常
【发布时间】:2020-11-14 07:41:06
【问题描述】:

我有一个在表上有触发器的 oracle 数据库。如果满足某些条件,它会在删除时引发自定义异常。在 Java 中,我在 DAO 层中使用 NamedParameterJdbcTemplate。结构是经典的controller-service-dao。如何在 Java 中捕获此异常的文本?提前致谢。 这是我的触发器。

create or replace TRIGGER "ME"."EDITABLE_SETTINGS_DELETE" 
BEFORE DELETE ON "ME"."MAP_SETTINGS"
FOR EACH ROW
ENABLE
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
CURSOR is_editable_cursor IS
select is_editable
from map_calculation mc 
inner join map_calculation_group mg on mc.id_calc = mg.id_calc
where mg.id_calc = mc.id_calc and mg.id_settings = :old.id_settings;
TYPE is_editable_table IS TABLE OF VARCHAR2(1 CHAR);
v_is_editable is_editable_table;
BEGIN
OPEN is_editable_cursor;
FETCH is_editable_cursor BULK COLLECT INTO v_is_editable;
CLOSE is_editable_cursor;
IF ('F' MEMBER OF v_is_editable) THEN
    RAISE_APPLICATION_ERROR( -20017, 'You cannot delete settings inn an uneditable calculation' );
END IF;
COMMIT;
END;

这是 dao 实现

@Override
    public void delete(Integer id) {
        SqlParameterSource parameters = new MapSqlParameterSource().addValue("ID_SETTINGS", id);
        try {
            namedParameterJdbcTemplate.update(DELETE_SQL, parameters);
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new RuntimeException("Error during deletion: " + e.getMessage());
        }
    }

这是反应前按钮

                        <Button
                            variant='primary'
                            onClick={() => {
                                globalProps
                                    .deleteItem()
                                    .then(() => {
                                        table.draw();
                                    })
                                    .catch((e) => {
                                        console.log(e);
                                        this.setState({ error: e.message });
                                        this.setState({ showModalBatch: true });
                                    });
                                this.props.toggleShowDelete();
                            }}
                        >
                            Удалить
                        </Button>

我有一个显示消息的模式,它显示的只是“请求失败,状态码 500”

【问题讨论】:

  • 你能说明你是如何在数据库中引发异常的吗?
  • 为什么它与捕获和处理任何其他异常不同?
  • oracle 中的自定义引发异常通常使用从 -20001 到 -20999 的代码。捕获或处理任何其他异常应该没有什么不同。
  • 我会用一些代码编辑
  • 已编辑,请看

标签: java reactjs oracle exception error-handling


【解决方案1】:
try {
    ...
} catch (DataAccessException ex) {
    if (ex.getRootCause() instanceof SQLException) {
        SQLException sqlEx = (SQLException) ex.getRootCause();
        int errorCode = sqlEx.getErrorCode();
        if (errorCode == -20017) {
            ...
        }
    }
}

【讨论】:

  • 我试过了,但它说我不能使用 SQLException 因为 try 里面的语句从不抛出一个
  • 不知何故没有这样的根本原因,因为在这种情况下我根本没有得到任何模态......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多