Oracle中 “ORA-14551: 無法在查詢中執行 DML 操作” 如何解決


在編寫一個數據庫函數時,方法實現需要查詢后進行修改,出現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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM