2013-09-26 48 views
0

我在Oracle函數中使用這個select語句,這個輸入被傳遞給一個Cursor進行處理。當我使用where子句時,如果我刪除它,它正在工作正常,它將錯誤地輸出「ORA-14552,無法在查詢或DML中執行DDL,提交或回滾」。ora 14552-不能使用DDl,COMMIT錯誤

Select * 
    from TableName 
where ((EFFECTIVE_DATE<= to_date(to_char(sysdate,'mm-dd-yyyy'),'mm-dd-yyyy')) 
    and (Effective_End_Date >= SYSDATE OR Effective_End_Date = TO_DATE('01/01/0001','MM/DD/YYYY'))) 

實際的功能: -

Create Function Name(in_name) Return varchar2 
Is 
Cursor S 
IS Select v1,v2,v3 from tablename; 
Begin 
    OPEN S 
     Loop Fetch S into v_1, v_2, v_3; 
     Exit when S%NOTFOUND; 
     if (v_3 is null) 
      Then For gm_rec in (Select x,y,z,c from Tablename where 
         Tablename.x=V_1 
         and Tablename.y=V_2 
        ) 
      Loop 
      RETURN(gm_rec.z) 
      End Loop; 

     if (v_3 is not null) 
      Then For gm_rec1 in (Select x,y,z,c from Tablename where 
         Tablename.x=V_1 
         and Tablename.y=V_2 
         ) 
      Loop 
      RETURN(gm_rec1.c) 
      End Loop; 
       End IF; 
      Close S; 
     Commit; 
END 

有沒有辦法解決這個錯誤?我需要添加where子句來過濾掉舊記錄。

+1

通常,在select語句中使用包含commit的存儲過程時會引發錯誤'ORA-14552'。您可以使用'pragma autonomous_transaction'解決這個錯誤,但最好避免它。 –

+0

檢查此鏈接 - http://www.dba-oracle.com/t_ora_14552_cannot_perform_ddl_commit_or_rollback.htm – Gourabp

+0

您有另一種選擇,您可以使用動態SQL來運行DML和TCL。 – Gourabp

回答

0

我假設你實際上查詢一個視圖(或具有虛擬列的表)並且視圖(或虛擬列)正在調用PL/SQL函數。

裏面說的PL/SQL函數是一些帶有commit的DML。

要麼將​​該函數轉換爲自治事務,要麼不提交,也不要在函數中執行任何DML!

+0

如果我刪除了COMMIT;聲明它錯誤地發現FUNCTION RETURN NO VALUE。請在實際發佈中找到我更新的實際代碼。 – Ragav

+0

您粘貼的代碼在語法上看起來不正確。 –