【问题标题】:ora 14552- Cannot use DDl, COMMIT Errorora 14552 - 无法使用 DDl,提交错误
【发布时间】: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。

标签: oracle function


【解决方案1】:

我假设您实际上是在查询一个视图(或具有虚拟列的表),并且该视图(或虚拟列)正在调用 PL/SQL 函数。

在所说的 PL/SQL 函数内部是一些带有提交的 DML。

要么将该函数转换为自治事务,要么不执行提交,或者不在函数中执行任何 DML!

【讨论】:

  • 如果我删除 COMMIT;声明它是错误的函数返回无值。请在实际帖子中找到我的实际代码更新。
  • 您粘贴的代码在我看来在语法上不正确。
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2015-04-30
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多