我在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子句來過濾掉舊記錄。
通常,在select語句中使用包含commit的存儲過程時會引發錯誤'ORA-14552'。您可以使用'pragma autonomous_transaction'解決這個錯誤,但最好避免它。 –
檢查此鏈接 - http://www.dba-oracle.com/t_ora_14552_cannot_perform_ddl_commit_or_rollback.htm – Gourabp
您有另一種選擇,您可以使用動態SQL來運行DML和TCL。 – Gourabp