【问题标题】:Execute a procedure inside a function (ORA-14551 error)在函数内执行过程(ORA-14551 错误)
【发布时间】:2013-01-27 09:42:32
【问题描述】:

这个问题与我的previous question有关。

我有一个程序 (PROC_YEARLYACTIVELIST2) 将显示指定年份的所有活动记录。
它将删除TBLACTIVELISTYEARLY2之前的内容并插入PROC_YEARLYACTIVELIST2的结果。

我创建了一个函数,它将执行TBLACTIVELISTYEARLY2,从TBLACTIVELISTYEARLY 中选择所有记录并将其放入CURSOR C_IH,并为Crystal Report 返回表格。

以下只是部分代码:

宣布 CURSOR C_IH IS SELECT * FROM tblActiveListYearly2; ctr 整数; 我号码; currDeploymentComputer COL_TYPE_DEPLOYMENT_COMPUTER := COL_TYPE_DEPLOYMENT_COMPUTER NULL); R_IH C_IH%ROWTYPE; 开始 PROC_YEARLYACTIVELIST2(in_year); 打开 C_IH; 我:= 0; 环形 (....)

我尝试将函数调用为

SELECT GETDEPLOYMENT_COMPUTER('2012') from dual;

并且有一个ORA-14551 错误

ORA-14551: cannot perform a DML operation inside a query 
ORA-06512: at "NPLS.PROC_YEARLYACTIVELIST2", line 12
ORA-06512: at "NPLS.GETDEPLOYMENT_COMPUTER", line 3

搜索了一下,发现是因为和INSERTUPDATE或者DELETEDUAL有冲突。

还有其他方法可以在返回表的函数中执行我的过程吗?

谢谢!

【问题讨论】:

  • 阅读自治事务。不漂亮,但可能是您情况的唯一解决方法。
  • 感谢@a_horse_with_no_name 的回复! :)

标签: oracle function procedure dml


【解决方案1】:

我认为您需要将 DML 更改和报告部分分开。应该在您的报告函数调用之外调用进行数据更改的过程...

【讨论】:

  • 但是怎么做呢?我可以将我的程序放在我的水晶报告中,但我猜水晶无法处理 oracle 查询。所以,我正在尝试创建一个只返回表的函数。嗯,我可以使用流水线或包功能,还是什么?你能给我一个建议吗?谢谢!
  • 你可以尝试另一种方法 - 而不是 chaging 表数据 - 只需选择你需要的东西吗?
  • 是的,你是对的。我只是无视 DML 并使用表格。感谢您的回复! :)
【解决方案2】:

没有;出于很好的原因,您不能在 SELECT 语句中执行 DML。

您正在更改数据库中的数据,而 Oracle 需要一个读取一致的数据视图,即它需要知道您选择的内容不会被您选择的内容改变。

你正在做的事情听起来非常不必要;您有一个 3 步流程:

  1. 从表中删除一些数据
  2. 将新数据插入该表中
  3. 从表格中选择数据。

为什么不简单地选择您需要的数据;会快很多吗?如果您必须预处理数据,那么您可以有一个与数据选择异步执行此操作的过程。

我对 Crystal Reports 一无所知,但您也可以在 PL/SQL 块中执行此操作。

declare
   l_getdeployment my_variable_type;
begin
   l_getdeployment := GETDEPLOYMENT_COMPUTER('2012');
end;
/

【讨论】:

  • 是的,你是对的!我只是选择了我想要的并使用函数返回。并无视TBLACTIVELISTYEARLY2。感谢您的答复! :)
【解决方案3】:

这太复杂了。
由于我想从表格中获取记录到水晶报表中,我将我选择的内容放到表格中。

现在,我意识到我可以将我的过程中的逻辑放入函数中,将其放入 SYS_REFCURSOR,返回并使用以下查询调用函数:

SELECT * FROM TABLE(GETDEPLOYMENT_COMPUTER('2012'));

无论如何,感谢那些回复并帮助我的人。 :)

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 2016-05-06
    • 1970-01-01
    • 2012-09-09
    • 2016-08-15
    • 1970-01-01
    • 2019-03-05
    • 2016-06-05
    • 2012-09-10
    相关资源
    最近更新 更多