【发布时间】:2015-12-19 01:56:47
【问题描述】:
我做了一个类似...的函数
create or replace function
pile_data
(v_id IN NUMBER, v_area IN VARCHAR2, v_cust_id IN NUMBER)
return VARCHAR2
AS
rs VARCHAR2(2);
cur_id NUMBER;
-- PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
select if_seq.currVal into cur_id from dual;
select '00' into rs from dual;
insert into IF_WORK
(id, area, cust_id, rc)
values
(if_tx_seq.nextVal, v_area, v_cust_id, rs);
update IF_WORK set rc=rs where id = cur_id;
return rs;
exception
when dup_val_on_index then
select '01' into rs from dual;
return rs;
end;
我有两个问题
- 如何调用这个函数作为测试?
- 是否可以在
exception语句中返回值?
下面的代码是我想要实现的(我用java做的,但必须用PLSQL实现)
public String pile_data(String ... params){
String rs = "00";
int cur_id = SEQ.currVal;
try{
insert(params);
}catch(Exception ex){
//HANDLING ERRORS
String exceptionName = ex.getClass().getName();
switch (exceptionName) {
case "KEY_DUPLICATION":
rs = "01";
break;
case "CONNECTION_TIMEOUT":
rs = "02";
break;
default:
rollback();
rs = "99";
break;
}
}finally{
// UPDATE ORIGINAL TABLE
update(cur_id, rs);
}
return rs;
}
关于代码的我的条件。
- 无论如何都必须返回(成功或失败)
- 无论插入成功与否都要更新
对于 java 代码,我很抱歉,但这是我能解释得最好的。感谢您的回答。 b
======== 编辑
对不起,我没有告诉我失败的原因。 (来自Oracle的错误代码,我自己翻译的消息)
-
execute pile_data(params ... );。它返回此错误ORA-06550 : it is not a procedure or not defined -
select pile_data(params) from dual;。它返回错误ORA-14552: Can not execute DDL, Commit, Rollback which is inside of Query or DML
================= 编辑#2 ================
所以我现在尝试将其更改为具有返回值的过程。 但是,由于调用者需要得到结果,所以我用函数包装。
create or replace procedure
pile_data
(params ... , rs OUT VARCHAR2)
IS
cur_id NUMBER;
BEGIN
select if_seq.currVal into cur_id from dual;
select '00' into rs from dual;
insert into IF_WORK
(target params ..., rc)
values
(params ..., rs);
update IF_WORK set rc=rs where tx_id = cur_id;
-- DBMS_OUTPUT.PUT_LINE(rs); -- it does not work
exception
when dup_val_on_index then
select '01' into rs from dual;
-- DBMS_OUTPUT.PUT_LINE(rs);
when others then
rollback;
select '99' into rs from dual;
-- DBMS_OUTPUT.PUT_LINE(rs);
end;
create or replace function pile_data_wrapper(params ...)
return varchar2
is
rs varchar2(2);
begin
pile_data(params ... , rs);
return rs;
end;
select pile_data_wrapper(params ... ) from dual;
我还是得到了ORA-14552。
我进退两难,一个函数导致错误,一个过程不能返回。 我需要更好的解决方案。
我想要的目标在下面
- 远程数据库会调用我的函数,我需要返回响应码。
- 在这个函数中,我必须插入和更新一个表。
谢谢
【问题讨论】:
-
据我所知,没有办法绕过不允许函数发出 DML 语句的限制。您需要将函数更改为带有
OUT参数的过程才能获得返回值 -
@a_horse_with_no_name 感谢您的回答。但如果你不介意,你能推荐一个返回值的过程的例子吗?谢谢
标签: java oracle function plsql oracle11g