1. 程式人生 > >Oracle——無法在查詢中執行 DML 操作

Oracle——無法在查詢中執行 DML 操作

今天在呼叫Oracle Function遇到一個異常

這是我的函式(為了再現隨手寫的)

create or replace function test_f(id varchar2)   return varchar2 is
    Result   varchar2(100);
begin

  insert into sfcs_temp_17109
  (sn)values(id);

 commit;
  return result;
end test_f;

解決方法:增加PRAGMA AUTONOMOUS_TRANSACTION

自治事務介紹

 

create or replace function test_f(id varchar2)   return varchar2 is
    Result   varchar2(100);
   PRAGMA AUTONOMOUS_TRANSACTION;
begin
  insert into sfcs_temp_17109
  (sn)values(id);

  commit;
  return result;
end test_f;

然後又遇到第二個問題

function如下:

create or replace function test_f(id varchar2) return varchar2 is
  Result varchar2(100);
  PRAGMA AUTONOMOUS_TRANSACTION;
  MSD_PN VARCHAR2(50);
begin
  BEGIN
    select didbar into MSD_PN from t_did where diddid = ID;
    IF MSD_PN IS NOT NULL THEN
      RESULT := 'ERROR:' || ID || '在系統中不存在!';
      RETURN RESULT;


    END IF;
  END;
  insert into sfcs_temp_17109 (sn) values (id);
  commit;
  return result;
end;

Return Result commit或者Rollback

create or replace function test_f(id varchar2) return varchar2 is
  Result varchar2(100);
  PRAGMA AUTONOMOUS_TRANSACTION;
  MSD_PN VARCHAR2(50);
begin
  BEGIN
    select didbar into MSD_PN from t_did where diddid = ID;
    IF MSD_PN IS NOT NULL THEN
      RESULT := 'ERROR:' || ID || '在系統中不存在!';
      commit;
      RETURN RESULT;
    END IF;
  END;
  insert into sfcs_temp_17109 (sn) values (id);
  commit;
  return result;
end;

增加commit後即可正常使用。