Oracle中 “ORA-14551: 無法在查詢中執行 DML 操作” 如何解決
阿新 • • 發佈:2019-04-16
無法 nsa 大於 val oracle 最大值 update 更新序號 max
在編寫一個數據庫函數時,方法實現需要查詢後進行修改,出現ora-14551的錯誤
create or replace function fun_DxcBillSn(tabType integer,tabName varchar2,fieldStr varchar2)return integer is serialSn integer; maxVal integer; nowMonth varchar(20); begin --獲取當前時間的月份-- select to_char(Sysdate,‘MM‘) into nowMonth from dual;--檢查是否存在單號最大值 表名+ 類型 + 月份+字段 --- select COUNT(*) into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --如果大於0 ,證明存在序號記錄-- if maxVal >0 then --獲取序號表的最大值 -- select MAXVAL into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --獲取序號ID值 -- serialSn:= maxVal+1; --更新序號表記錄的值 -- update DXC_SYSSN set MAXVAL=serialSn where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --如果小於等於0 ,證明不存在記錄 else--刪除舊數據記錄 delete from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and FIELD=fieldStr; -- 返回序號的ID -- serialSn:=1; --添加新的數據記錄 insert into DXC_SYSSN(TABLENAME,BILLTYPE,MONTH,FIELD,MAXVAL) values(tabName,tabType,nowMonth,fieldStr,serialSn); end if; return serialSn; end;
解決方法
在聲明函數之前加上pragma autonomous_transaction ,在執行DML語句後Commit;
經過如上修改後的函數如下
create or replace function fun_DxcBillSn(tabType integer,tabName varchar2,fieldStr varchar2)return integer is --開啟自治事務(解決Oracle ORA-14551: 無法在查詢中執行 DML 操作的問題)-- pragma autonomous_transaction; serialSn integer; maxVal integer; nowMonth varchar(20); begin --獲取當前時間的月份-- select to_char(Sysdate,‘MM‘) into nowMonth from dual; --檢查是否存在單號最大值 表名+ 類型 + 月份+字段 --- select COUNT(*) into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --如果大於0 ,證明存在序號記錄-- if maxVal >0 then --獲取序號表的最大值 -- select MAXVAL into maxVal from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --獲取序號ID值 -- serialSn:= maxVal+1; --更新序號表記錄的值 -- update DXC_SYSSN set MAXVAL=serialSn where TABLENAME=tabName and BILLTYPE=tabType and MONTH=nowMonth and FIELD=fieldStr; --如果小於等於0 ,證明不存在記錄 else --刪除舊數據記錄 delete from DXC_SYSSN where TABLENAME=tabName and BILLTYPE=tabType and FIELD=fieldStr; -- 返回序號的ID -- serialSn:=1; --添加新的數據記錄 insert into DXC_SYSSN(TABLENAME,BILLTYPE,MONTH,FIELD,MAXVAL) values(tabName,tabType,nowMonth,fieldStr,serialSn); end if; commit; -- 提交事務 return serialSn; end;
參考來源:https://www.linuxidc.com/Linux/2013-06/86713.htm
Oracle中 “ORA-14551: 無法在查詢中執行 DML 操作” 如何解決