我做了一個功能像...Oracle 11g - 如何在DML中調用一個函數?
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;
而且我有2個問題
- 如何調用該函數的測試?
- 是否有可能在
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;
}
我對代碼的條件是什麼。
- 不得不反正(成功或NOT)返回
- 必須更新,是否插入成功與否
我對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
。
我有一個困境,一個函數導致錯誤,並且程序無法返回。 我需要更好的解決方案。
我想我們的目標是低於
- 遠程DB會打電話給我的功能,我需要返回響應代碼。
- 在這個函數中我必須插入和更新一個表。
感謝
據我所知,沒有辦法限制函數不允許發佈DML語句。你將需要改變你的函數到一個帶有'OUT'參數的程序以獲得返回值 –
@a_horse_with_no_name感謝您的回答。但如果你不介意,你能否提出一個返回值的過程的例子?謝謝 –