Plsql PL/SQL批量集合插入语法

Plsql PL/SQL批量集合插入语法,plsql,insert,bulk-collect,Plsql,Insert,Bulk Collect,我的任务是在一个表中插入一个新的事务\u代码,该表包含同一个表中的最小成本和最大成本。我试图做的是从交易代码为2的县中获取最小成本,从交易代码为4的县中获取最大成本。到目前为止,我就是这样 我将收到的错误作为注释写在收到它们的行旁边。我还尝试将数组用作表,我不认为它会起作用,但我将它们放在那里,以便您了解我尝试了什么(它们被注释掉) 非常感谢您向正确的方向努力。您的SQL语句后缺少分号。试一试 declare type cost_min_array IS TABLE OF court_

我的任务是在一个表中插入一个新的
事务\u代码
,该表包含同一个表中的最小成本和最大成本。我试图做的是从交易代码为2的县中获取最小成本,从交易代码为4的县中获取最大成本。到目前为止,我就是这样

我将收到的错误作为注释写在收到它们的行旁边。我还尝试将数组用作表,我不认为它会起作用,但我将它们放在那里,以便您了解我尝试了什么(它们被注释掉)


非常感谢您向正确的方向努力。

您的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

很抱歉,它花了一段时间才做出响应,这些更改似乎永远都在运行。我今天没有时间调查此事,但我会回来报告的。谢谢你的帮助!稍微看一下代码,您似乎会在COURT_COST中插入很多行。
INSERT-INTO-COURT\u COST
有一个
SELECT
,它是不合格的-因此它将返回COURT\u COST中的每一行。在我看来,对于v_min_COST数组中的每个值,您将获得COURT_COST表的完整副本,并将其重新插入自身。假设COURT_COST从10000行开始,v_min_COST有500个值。在这种情况下,在我看来,插入完成后,您将在表中添加500*10000=5000000行。
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