gpt4 book ai didi

oracle - 在函数内部执行过程(ORA-14551 错误)

转载 作者:行者123 更新时间:2023-12-04 05:11:57 24 4
gpt4 key购买 nike

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

我有一个程序( PROC_YEARLYACTIVELIST2 )将显示在指定年份处于事件状态的所有记录。
它将删除 TBLACTIVELISTYEARLY2 之前的内容并插入来自 PROC_YEARLYACTIVELIST2 的结果.

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

下面只是部分代码:

DECLARE  CURSOR C_IH IS SELECT * FROM tblActiveListYearly2;  ctr INT;  i NUMBER;    currDeploymentComputer COL_TYPE_DEPLOYMENT_COMPUTER := COL_TYPE_DEPLOYMENT_COMPUTER NULL);  R_IH C_IH%ROWTYPE; BEGIN PROC_YEARLYACTIVELIST2(in_year);  OPEN C_IH;   i := 0;    LOOP (....)

I've tried to call the function as

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冲突了, UPDATEDELETEDUAL .

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

谢谢!

最佳答案

不;出于很好的理由,您不能在 SELECT 语句中执行 DML。

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

你在做什么听起来非常没有必要;你有一个 3 步过程:

  • 从表中删除一些数据
  • 将新数据插入该表
  • 从表中选择数据。

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

    我对 Crystal Reports 一无所知,但您也可以在 PL/SQL 块中执行此操作。
    declare
    l_getdeployment my_variable_type;
    begin
    l_getdeployment := GETDEPLOYMENT_COMPUTER('2012');
    end;
    /

    关于oracle - 在函数内部执行过程(ORA-14551 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14826538/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com