【发布时间】:2013-09-26 20:42:50
【问题描述】:
我在一个 Oracle 函数中使用这个 select 语句,这个输入被传递给一个 Cursor 进行处理。当我使用where 子句时,如果我删除它,它会出错“ORA-14552,无法在查询或 DML 中执行 DDL、提交或回滚”。
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 语句中使用包含提交的存储过程时,会引发错误
ORA-14552。您可以使用pragma autonomous_transaction来解决此错误,但最好避免它。 -
查看此链接 - dba-oracle.com/…
-
您还有另一个选择,您可以使用动态 SQL 来运行 DML 和 TCL。