Ошибка в коде PLSQL - ORA 06550

DECLARE 
 CURSOR cur 
 IS 
 SELECT dm.fash unit, h1.groupin, '01' startin, SUM (h1.weight) 
 FROM tab1 t1 INNER JOIN tab2 h1 ON t1.ALTER = h1.unit 
 INNER JOIN unit dm ON t1.col1 = dm.unit 
 WHERE t1.col1 IN (SELECT col1 
 FROM tab1 
 WHERE sw = 1) 
 AND h1.eve = 'Al' 
 AND NOT EXISTS (SELECT 1 
 FROM tab2 
 WHERE unit = t1.col1) 
 GROUP BY dm.fash, h1.groupin; 


BEGIN 
 FOR rec_in IN cur 
 LOOP 
 INSERT /*+append*/INTO targ 
 (unit, groupin, startin, 
 weight, length, height 
 ) 
 VALUES (rec_in.unit, rec_c1.groupin, rec_c1.startin, 
 rec_c1.weight, 4, 5 
 ); 
 END LOOP; 

 COMMIT; 
END; 
/

Это может быть легко. Но я не могу найти причину.

Когда я запускаю вышеуказанный запрос, я получаю сообщение об ошибке, указывающее, что должен быть объявлен компонент "ВЕС" (полевой вес в поле значений rec_c1.weight). В таблице Targ есть столбцы - UNIT, GROUPIN, STARTIN, WEIGHT, LENGTH, HEIGHT

2 ответа

Я не знаю Oracle, но я думаю, вам нужно назвать столбец SUM, то есть SUM (h1.weight) weight

Но вам действительно нужен курсор? Не можете ли вы сделать вставку с выбором?

INSERT INTO targ 
 (unit, groupin, startin, 
 weight, length, height 
 )
SELECT dm.fash unit, h1.groupin, '01' startin, SUM (h1.weight) 
 FROM tab1 t1 INNER JOIN tab2 h1 ON t1.ALTER = h1.unit 
 INNER JOIN unit dm ON t1.col1 = dm.unit 
 WHERE t1.col1 IN (SELECT col1 
 FROM tab1 
 WHERE sw = 1) 
 AND h1.eve = 'Al' 
 AND NOT EXISTS (SELECT 1 
 FROM tab2 
 WHERE unit = t1.col1) 
 GROUP BY dm.fash, h1.groupin;


У вас есть опечатка в цикле курсора с квалификацией столбцов из вашего курсора. Вы указали идентификатор цикла как rec_in, но набрали rec_c1 для groupin, startin и weight:

BEGIN 
FOR rec_in IN cur 
LOOP 
 INSERT /*+append*/INTO targ 
 (unit, groupin, startin, 
 weight, length, height 
 ) 
 VALUES (rec_in.unit, rec_c1.groupin, rec_c1.startin, 
 rec_c1.weight, 4, 5 
 ); 
END LOOP; 

COMMIT; 
END;

/

Это должно быть rec_in так же, как с единицей:

BEGIN 
FOR rec_in IN cur 
LOOP 
 INSERT /*+append*/INTO targ 
 (unit, groupin, startin, 
 weight, length, height 
 ) 
 VALUES (rec_in.unit, rec_in.groupin, rec_in.startin, 
 rec_in.weight, 4, 5 
 ); 
END LOOP; 

COMMIT; 
END;

/

licensed under cc by-sa 3.0 with attribution.