【发布时间】: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