2

这个问题与我之前的问题有关

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

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

以下只是部分代码:

宣布
  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

搜索了一下,发现是因为和INSERT, UPDATEor DELETEand冲突DUAL

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

谢谢!

4

3 回答 3

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;
/
于 2013-02-12T08:22:24.897 回答
1

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

于 2013-02-12T06:32:08.003 回答
0

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

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

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

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

于 2013-02-13T01:50:07.327 回答