Где ошибка в созданной мною процедуре?

Сергей Б
Дата: 13.06.2006 15:44:36
Создал процедуру, которая выбирает данные по запросу и вставляет их в некую таблицу.
Процедура создается, состояние ее - valid.
А данных в таблице nzb.cred нет, хотя если сделать выборку по запросу, то данные выбираются.
SELECT t1.c1 item_id,t2.c1 ITEM_DATE
FROM t1,t2
WHERE t1.c3 = t2.c3

CREATE OR REPLACE PROCEDURE nzb 
(item_id in out VARCHAR2,
item_date in out DATE)
as cursor c_nz is
SELECT t1.c1 item_id,t2.c1 ITEM_DATE
FROM t1,t2
WHERE t1.c3 = t2.c3
begin 
open c_nz; 
loop
fetch c_nz
INTO item_id,item_date;
exit when c_nz%notfound;
INSERT INTO gc.nzb_cred VALUES (item_id,item_date);
END LOOP;
close c_nz;
COMMIT;
end nzb;
/
Sergey_Evdokimov
Дата: 13.06.2006 15:47:52
А так не просче?
INSERT INTO gc.nzb_cred VALUES (item_id,item_date)
SELECT t1.c1 item_id,t2.c1 ITEM_DATE
FROM t1,t2
WHERE t1.c3 = t2.c3;
 
mcureenab
Дата: 13.06.2006 15:48:11
Так поцедуру то выполнить надо!

var item_id number
var item_date varchar2(30)
exec nzb(:item_id, :item_date)
mcureenab
Дата: 13.06.2006 15:49:50
Что то не пойму о какой таблице речь?

nzb.cred или gc.nzb_cred
pamir
Дата: 13.06.2006 15:50:27
1. Нафига процедуре параметры, если они используются как переменные?
2. Зачем тут курсор, когда можно выполнить insert into... (select... from )
3. Куда делись данные я не знаю
Sergey_Evdokimov
Дата: 13.06.2006 15:50:58
Поправочка к моему посту (все-таки фиговый из мня тестер):
INSERT INTO gc.nzb_cred 
SELECT t1.c1,t2.c1 
FROM t1,t2
WHERE t1.c3 = t2.c3;
Сергей Б
Дата: 13.06.2006 15:59:32
Процедура нужна для того, чтобы ночью пакет dbms_job ночью отрабатывал и по результатам выборки вставлял данные в некую таблицу. Если здесь не использовать курсор, то постоянно вылетает ошибка, что в запросе не одна строка.
Версия Oracle 8.1.7
У меня есть pl\sql код, который отрабатывает как часы, но еще раз повторю, мне это нужно для использования, dbms_job. Я бы мог это сделать через cron, но хочется все это сделать средствами оракла
dmidek
Дата: 13.06.2006 16:01:10
С трудом просматривается смысл входных / выходных параметров.
Как входные - они точно не нужны, а как выходные, Вы вернете значения
item_id и item_date, которые случайно выберутся из курсора последними.
Зачем Вам это ?

Кстати
cursor c_nz is
SELECT t1.c1 item_id,t2.c1 ITEM_DATE
FROM t1,t2
WHERE t1.c3 = t2.c3

тут в конце чего - то не хватает :), так что как процедура откомпилировалась, я тоже не понимаю
pamir
Дата: 13.06.2006 16:05:49
Сергей Б
Если здесь не использовать курсор, то постоянно вылетает ошибка, что в запросе не одна строка.


Потому что нужно их не в переменные класть, а пихать сразу в нужную таблицу. Вам же уже подсказали конструкцию insert into <table> (select from <other_table>).
insert_in_proc
Дата: 13.06.2006 16:27:01
eсли без последующей обработки данных то
create or replace procedure do_insert
as
begin
 INSERT INTO gc.nzb_cred VALUES (item_id,item_date)
SELECT t1.c1 item_id,t2.c1 ITEM_DATE
FROM t1,t2
WHERE t1.c3 = t2.c3;
-- 
commit
end;
, с последующей обработкой внутри цикла
create or replace procedure do_insert
as
li_item_id integer;
ld_item_date date;
begin
 for cur in (select t1.c1 as item_id, t2.c1 as item_date from t1, t2 where t1.c3=t2.c3) loop
  li_item_id := cur.item_id;
  ld_item_date := cur.item_date;
  -- Обработка данных
  -- Insert
  insert into gc.nzb_cred VALUES (li_item_id, ld_item_date);
 end loop;
 -- 
 commit;
end;