ORA-14552: 在查询或 DML 中无法执行 DDL

出现这个问题的原因是在function中执行了DDL语句,而有个过程使用"select func(x) from table"格式调用了这个函数,由于这个过程是别的同事写的,出于种种原因无法去修改这个过程,好在函数中的DDL是个truncate历史表语句,临时解决办法只好是去掉DDL语句,并且加强的条件过滤,保障数据正确性。

换个角度考虑,如果函数中有执行DDL的必要,在调用的时候避免查询语句的调用,可以考虑:

v_func_ret:=func(x);

下面是简单的测试:

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as crmii

SQL>
SQL> Create Or Replace Function Func_Test(i_Num In Number) Return Number Is
2 o_Ret Number;
3 Begin
4 o_ret:=i_Num;
5 Return o_ret;
6 End;
7 /

Function created

SQL> Select Func_Test(1) from dual;

FUNC_TEST(1)
------------
1

SQL>
SQL> Create Or Replace Function Func_Test(i_Num In Number) Return Number Is
2 o_Ret Number;
3 Begin
4 Commit;
5 o_ret:=i_Num;
6 Return o_ret;
7 End;
8 /

Function created

SQL> Select Func_Test(1) from dual;

Select Func_Test(1) from dual

ORA-14552: 在查询或 DML 中无法执行 DDL, 提交或回退
ORA-06512: 在 "TEST.FUNC_TEST", line 4

SQL>

-The End-

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值