2011-12-14 3 views
0

У меня есть отчет о кристаллах, который возвращает нужные мне записи на основе критериев, которые я добавил в отчете. Я также хочу, чтобы этот отчет обновлял записи в базе данных при его запуске. Для этого я создал процедуру (в oracle) ниже. Как это сделать? Мне действительно нужна только часть, которая обновляет записи для запуска в процедуре. Это возможно? смысл я могу запустить процедуру из того же отчета, который я бы построил, как я обычно делаю (используя select expert)? Я как бы сэндвич обновляющий статус между статусом, который возвращает записи, поскольку мое исследование указывает, что я не могу просто запустить часть обновления из кристалла. когда я пытаюсь использовать описанную ниже процедуру, кристалл выдает неверный аргумент, предоставленный с ошибкой.необходимо обновить записи с помощью отчета о кристалле

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"; 
+2

Почему в мире вам нужен отчет для обновления данных? – craig

ответ

1

Создание функции с автономной транзакции:

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 как часть ЗЕЬЕСТ, как правило, ужасно вы должны стараться избегать. SQL не дает никаких гарантий относительно , как все будет выполнено. Crystal Reports не всегда выполняет каждый запрос в отчете. Будьте очень осторожны и тщательно испытайте. Или еще лучше, найдите другой способ сделать это.

Смежные вопросы