需要用水晶报告更新记录

时间:2011-12-14 21:03:16

标签: oracle stored-procedures crystal-reports

我有一份水晶报告,根据我在报告中添加的标准返回我需要的记录。我还希望此报告在运行时更新数据库中的记录。为此,我在下面创建了程序(在oracle中)。我怎么运行这个?我真的只需要更新记录的部分在程序中运行。这可能吗?意思是我可以从我正常建立的同一报告中运行程序(使用选择专家)?我有点将更新声明夹在一个返回记录的状态之间,因为我的研究表明我不能只运行晶体的更新部分。当我尝试使用以下程序时,水晶会抛出一个无效的参数,提供错误。

 create or replace Procedure           "P_UPDATE_REPORT_DATE_2" (

 N_BEGIN IN date,

 N_END IN date)

 is

 CUS_ID NUMBER;

 cursor c1 is select customer_id FROM customer;

 begin

 --real begining

 update dbo.customer set REPORT_DATE= sysdate 

 where customer.customer_id in

 (SELECT customer.custoemr_id

  FROM   dbo.CUS_ADDRESS CUS_ADDRESS INNER JOIN (((dbo.CUS_ASSOC_V
 CUS_ASSOC_V INNER JOIN dbo.customer customer ON
 CUS_ASSOC_V.ASSOC_ID=customer.ASSOC_ID) INNER JOIN dbo.ITEM ITEM ON
 CUSTOMER.ITEM_NUMBER=ITEM.ITEM_NUMBER) LEFT OUTER JOIN
 dbo.PAY_TYPE_CODE PAY_TYPE_CODE ON
 CUSTOMER.PRIM_PAY=PAY_TYPE_CODE.CODE) ON
 ITEM_ADDRESS.ADDRESS_ID=ITEM.ITEM_ADDRESS_ID

  WHERE  CUSTOMER.FACILITY='CHI' 

  AND CUSTOMER.START_DATE<= N_END 

  AND CUSTOMER.END_DATE>= N_BEGIN

  AND CUSTOMER.CUSTOMER_TYPE_CODE='O');

  commit;

 --fake to create sandwich

 OPEN c1;

    LOOP

       FETCH c1 INTO CUS_ID;

       EXIT WHEN c1%NOTFOUND;

       DBMS_OUTPUT.PUT_LINE(CUS_ID);

    END LOOP;


 end "P_UPDATE_REPORT_DATE_2";

1 个答案:

答案 0 :(得分:2)

使用自治事务创建一个函数:

create or replace function my_function return number is
    pragma autonomous_transaction;
begin
    --Perform DML here
    insert into my_table values(1);

    --You must commit or rollback within an autonomous transaction
    commit;

    --Return any dummy value
    return 1;
end;
/

然后使用SQL调用它:

select my_function from dual;

执行DML作为SELECT语句的一部分通常是一个你应该避免的可怕的事情。 SQL不保证 将如何执行。 Crystal Reports并不总是执行报表中的每个查询。要非常小心并彻底测试。或者甚至更好,找到其他方法来实现这一目标。