2013-06-10 2 views
0

Я попытался обновить таблицу в поле1 следующей процедурой pl sql, компиляцию и выполнение, выполненные без каких-либо ошибок, поставить, когда я вызываю эту процедуру, обновление не работает. Не знаю почему! Я использовал (for update of .... current of) заявление с курсором и код нижеинструкция по обновлению во внутреннем цикле с процедурой pl sql

create or replace procedure p1 is 
r1 table1%rowtype; 
r2 table2%rowtype; 
cursor c1 is select * from table1 for update of field1; 
cursor c2 is select * from table2; 
begin 
open c1; 
loop <<outer>> 
    fetch c1 into r1; 
    open c2; 
     loop <<inner>> 
      fetch c2 into r2; 
       if condition then 
       dbms_output.put_line('ok');    
       update table1 
       set field1= 1 
       where current of c1;      
       end if; 
     exit when c2%notfound; 
     end loop inner;  
    close c2; 
    exit when c1%notfound; 
end loop outer; 
close c1; 
end; 
/

Примечания: условие в операторе IF является правильным, потому что, когда я выполнить процедуру заявление (dbms_output.put_line('ok');) успешно выполнено каждый раз, когда цикл выполняется, когда Я удаляю инструкцию update и (для обновления ... current of), но когда я поставил оператор update с (для обновления ... текущего) оператора с тем же условием, инструкция обновления не Работа.

+1

Вам не нужна петля вообще. Насколько я могу судить по вашему запутанному примеру, это, вероятно, все может быть сделано с помощью одного оператора обновления. –

+0

+1 к @a_horse_with_no_name. я также хотел бы добавить, что нет смысла обновлять каждую строку c1 для каждой строки c2. вы будете обновлять одну и ту же строку снова и снова. вам не нужно plsql здесь. – haki

ответ

0

Как проверить, работает ли обновление?

Если вы запрашиваете таблицу в другом сеансе, вы не увидите никаких изменений, внесенных вашим кодом до тех пор, пока вы не выполните инструкцию commit после вашего кода pl/sql.

+0

спасибо за повтор, эта процедура займет так много времени, поэтому я попытался запустить процедуру около 15 минут, а затем я отменил выполнение, но по крайней мере процедура должна печатать (ОК) в окнах dbms каждый раз, когда цикл выполняется , но когда я отменил прогон, выхода нет !!!!! – user2470764

+0

и я положил оператор фиксации между тем, где условие в обновлении и завершено, если подобное обновление cdr_table set ex_flag = 1 где ток cdr_cur; commit; end if; и это не работает !!!!!! – user2470764

+0

@ user2470764 Похоже, вы заблокировали строки, полученные курсором 'c1' в другом открытом сеансе. – ThinkJet

2
1) 

    open c2; 
     loop <<inner>> 
      fetch c2 into r2; 
       if condition then 
       dbms_output.put_line('ok');    
       update table1 
       set field1= 1 
       where current of c1; -- <---- YOU CANNOT USE THAT 
       end if; 
     exit when c2%notfound; 
     end loop inner;  
    close c2; 

2) Rewrite to plain SQL: 

CREATE TABLE table1(field1 NUMBER, field2 NUMBER); 
CREATE TABLE table2(field1 NUMBER, field2 NUMBER); 

INSERT INTO table1(field1, field2) VALUES(111, 121); 
INSERT INTO table1(field1, field2) VALUES(112, 122); 
INSERT INTO table1(field1, field2) VALUES(113, 123); 
INSERT INTO table1(field1, field2) VALUES(114, 124); 
INSERT INTO table1(field1, field2) VALUES(115, 125); 

INSERT INTO table2(field1, field2) VALUES(111, 121); 
INSERT INTO table2(field1, field2) VALUES(112, 122); 
INSERT INTO table2(field1, field2) VALUES(213, 123); 
INSERT INTO table2(field1, field2) VALUES(214, 124); 
INSERT INTO table2(field1, field2) VALUES(215, 125); 
COMMIT; 

UPDATE table1 
SET  field1 = 1 
WHERE EXISTS 
(
     SELECT 1 
     FROM table2 
     WHERE table1.field1 = table2.field1 
     AND  table1.field2 = table2.field2 
); 
-- 2 rows updated. 

SELECT * FROM table1; 
/* 
1 121 
1 122 
113 123 
114 124 
115 125 
*/ 
Смежные вопросы