PL/SQL Bulk Collection Синтаксис вставки
Мне поручено вставить новый transaction_code
в таблицу, которая содержит min_cost и max_cost из той же таблицы. То, что я пытаюсь сделать, это взять min_cost из округов с кодом транзакции 2 и max_cost из округов с кодом транзакции 4. Вот что я пока делаю.
Я написал ошибки, которые я получаю, в качестве комментариев рядом со строкой, в которой я их получаю. Я также пытался использовать массивы в качестве таблиц, я не думал, что это сработает, но я оставил их там, чтобы вы поняли, что я пытался (они закомментированы).
declare
type cost_min_array IS TABLE OF court_cost.cost_range_min%type INDEX BY BINARY_INTEGER;
type cost_max_array IS TABLE OF court_cost.cost_range_max%type INDEX BY BINARY_INTEGER;
v_min_cost cost_min_array;
v_min_cost cost_max_array;
BEGIN
begin
select cost_range_min -- SQL STATEMENT IGNORED
bulk collect into v_min_cost
from court_cost
where state = 'IL'
and transaction_code = 4
and end_date is null
order by county
EXCEPTION WHEN OTHERS THEN --SQL COMMAND NOT PROPERLY ENDED
v_min_cost.delete;
END;
BEGIN
select cost_range_max -- SQL STATEMENT IGNORED
bulk collect into v_max_cost
from court_cost
where state = 'IL'
and transaction_code = 2
and end_date is null
order by county
EXCEPTION WHEN OTHERS THEN -- SQL COMMAND NOT PROPERLY ENDED
v_max_cost.delete;
END;
for indx in 1..v_min_cost.count
loop
insert into court_cost -- SQL STATEMENT IGNORED
(TRANSACTION_CODE,
STATE,
COUNTY,
COST_RANGE_MIN,
BEGIN_DATE,
END_DATE,
DATE_INSERTED,
COURT,
COST_RANGE_MAX)
select lcc.TRANSACTION_CODE,
lcc.STATE,
lcc.COUNTY,
v_min_cost(indx),
lcc.BEGIN_DATE,
lcc.END_DATE,
lcc.DATE_INSERTED,
lcc.COURT,
v_max_cost(indx)
from court_cost lcc
-- cost_min_array cmn,
-- cost_max_array cmx
end loop; -- SQL COMMAND NOT PROPERLY ENDED
end; -- ENCOUNTERED THE SYMBOL ; WHEN EXPECTING LOOP
Спасибо за любой толчок в правильном направлении.
2 ответа
Вы пропускаете точки с запятой после ваших операторов SQL. Пытаться
declare
type cost_min_array IS TABLE OF court_cost.cost_range_min%type INDEX BY BINARY_INTEGER;
type cost_max_array IS TABLE OF court_cost.cost_range_max%type INDEX BY BINARY_INTEGER;
v_min_cost cost_min_array;
v_min_cost cost_max_array;
BEGIN
begin
select cost_range_min -- SQL STATEMENT IGNORED
bulk collect into v_min_cost
from court_cost
where state = 'IL'
and transaction_code = 4
and end_date is null
order by county; -- semi-colon added
EXCEPTION WHEN OTHERS THEN --SQL COMMAND NOT PROPERLY ENDED
v_min_cost.delete;
END;
BEGIN
select cost_range_max -- SQL STATEMENT IGNORED
bulk collect into v_max_cost
from court_cost
where state = 'IL'
and transaction_code = 2
and end_date is null
order by county; -- semi-colon added
EXCEPTION WHEN OTHERS THEN -- SQL COMMAND NOT PROPERLY ENDED
v_max_cost.delete;
END;
for indx in 1..v_min_cost.count
loop
insert into court_cost -- SQL STATEMENT IGNORED
(TRANSACTION_CODE,
STATE,
COUNTY,
COST_RANGE_MIN,
BEGIN_DATE,
END_DATE,
DATE_INSERTED,
COURT,
COST_RANGE_MAX)
select lcc.TRANSACTION_CODE,
lcc.STATE,
lcc.COUNTY,
v_min_cost(indx),
lcc.BEGIN_DATE,
lcc.END_DATE,
lcc.DATE_INSERTED,
lcc.COURT,
v_max_cost(indx)
from court_cost lcc; -- semi-colon added
-- cost_min_array cmn,
-- cost_max_array cmx
end loop; -- SQL COMMAND NOT PROPERLY ENDED
end; -- ENCOUNTERED THE SYMBOL ; WHEN EXPECTING LOOP
и посмотрим, улучшится ли это.
Поделитесь и наслаждайтесь.
Вы пропустили три точки с запятой в коде, что приводит к ошибкам. В коде вниз я добавил их, пожалуйста, проверьте, работает ли код сейчас. Инструкция игнорируется, потому что точка с запятой не добавляется в конце, и даже раздел об исключениях рассматривается в том же выражении, поэтому выдает ошибку.
declare
type cost_min_array IS TABLE OF court_cost.cost_range_min%type INDEX BY BINARY_INTEGER;
type cost_max_array IS TABLE OF court_cost.cost_range_max%type INDEX BY BINARY_INTEGER;
v_min_cost cost_min_array;
v_min_cost cost_max_array;
BEGIN
begin
select cost_range_min -- SQL STATEMENT IGNORED
bulk collect into v_min_cost
from court_cost
where state = 'IL'
and transaction_code = 4
and end_date is null
order by county--semi colon added
EXCEPTION WHEN OTHERS THEN --SQL COMMAND NOT PROPERLY ENDED
v_min_cost.delete;
END;
BEGIN
select cost_range_max -- SQL STATEMENT IGNORED
bulk collect into v_max_cost
from court_cost
where state = 'IL'
and transaction_code = 2
and end_date is null
order by county--semi colon added
EXCEPTION WHEN OTHERS THEN -- SQL COMMAND NOT PROPERLY ENDED
v_max_cost.delete;
END;
for indx in 1..v_min_cost.count
loop
insert into court_cost -- SQL STATEMENT IGNORED
(TRANSACTION_CODE,
STATE,
COUNTY,
COST_RANGE_MIN,
BEGIN_DATE,
END_DATE,
DATE_INSERTED,
COURT,
COST_RANGE_MAX)
select lcc.TRANSACTION_CODE,
lcc.STATE,
lcc.COUNTY,
v_min_cost(indx),
lcc.BEGIN_DATE,
lcc.END_DATE,
lcc.DATE_INSERTED,
lcc.COURT,
v_max_cost(indx)
from court_cost lcc;--semi colon added
-- cost_min_array cmn,
-- cost_max_array cmx
end loop; -- SQL COMMAND NOT PROPERLY ENDED
end; -- ENCOUNTERED THE SYMBOL ; WHEN EXPECTING LOOP