我有一份水晶报告,根据我在报告中添加的标准返回我需要的记录。我还希望此报告在运行时更新数据库中的记录。为此,我在下面创建了程序(在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";
答案 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并不总是执行报表中的每个查询。要非常小心并彻底测试。或者甚至更好,找到其他方法来实现这一目标。