2013-07-25 4 views
0

Мне поручено вставить новый transaction_code в таблицу, содержащую min_cost и max_cost из той же таблицы. То, что я пытаюсь сделать, это взять min_cost из округов с кодом транзакции 2 и max_cost из округов с транзакционным кодом из 4. Вот что я до сих пор.PL/SQL Bulk Collection Вставить синтаксис

Я написал ошибки, которые я получаю как комментарии рядом с линией, в которой я их получаю. Я также пытался использовать массивы в виде таблиц, я не думал, что это сработает, но я оставил их там, чтобы вы поняли, что я понял (они прокомментированы).

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 

Любое нажатие в правильном направлении будет принята с благодарностью, спасибо.

ответ

0

Вам не хватает полуколоней после ваших операторов 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 

и посмотреть, улучшилось ли это.

Делитесь и наслаждайтесь.

+0

Извините, на это потребовалось некоторое время, чтобы ответить, с этими изменениями он просто кажется бегущим навсегда. У меня не было времени, чтобы заглянуть в нее, но я отчитаю. Спасибо за помощь! – user2405778

+0

Посмотрев на код немного, кажется, что вы получите много строк, вставленных в COURT_COST. 'INSERT INTO COURT_COST' имеет' SELECT', который является неквалифицированным, поэтому он будет возвращать каждую строку в COURT_COST. На мой взгляд, похоже, что вы получите полную копию таблицы COURT_COST, вставленной в себя для каждого значения в массиве v_min_cost. Итак, предположим, что COURT_COST начинается с 10000 строк, а v_min_cost имеет 500 значений. В этом случае мне кажется, что вы добавите 500 * 10000 = 5 000 000 строк в таблицу, когда INSERT будет выполнен. –

1

Вы пропустили точки с запятой трижды в коде, что приводит к ошибкам. В коде вниз я добавил их, пожалуйста, проверьте, работает ли код. Утверждение, проигнорированное, происходит потому, что в конце этого слова не добавляется половина двоеточия, и даже раздел исключения рассматривается в том же самом заявлении, поэтому дается ошибка.

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 
Смежные вопросы