为什么批量收集不起作用?

时间:2018-08-09 08:29:54

标签: oracle plsql

我试图使用游标将表table_name中的所有记录加载到某些集合中,但完全无法正常工作。当我试图显示某些值时,我使用不正确的参数或带有该dbms_output.put_line()的不正确的数字出错。

table_name的各列仅包含Intiger,并且始终具有id列和x_1 ... x_10列,并具有10行。我只是不想输入x_1,x_2,x_3,x_4等。

我在做什么错了?

DECLARE
  cursor c_Table is
    select * from table_name;
  type x_values is table of game%rowtype;
  x_values_list x_values := x_values();
  square        int := 0;
  id_from_table int := 0;
  temp          int := 0;
BEGIN
  select Max(id) into square from table_name;
  x_values_list.extend(square*square+square);

  /*open table_game;
  fetch table_game bulk collect
    into x_values_list;
    */

  select * bulk collect into x_values_list
  from game;
  for i in 1..square loop
    dbms_output.put_line(x_values_list(i)|| ' ');
  end loop;

END;

1 个答案:

答案 0 :(得分:4)

不幸的是,您必须键入x_1x_2等。您目前正在尝试将记录类型传递到put_line()that procedure only accepts a string value

您显示的代码将获得:

  

PLS-00306:调用'||'时参数的数量或类型错误

因为您正尝试将记录类型与字符串连接;没有|| ' '部分,您将得到:

  

PLS-00306:“ PUT_LINE”调用中参数的数量或类型错误

没有一种机制可以将记录的字段神奇地转换为单个字符串,您必须自己做。

因此,您必须这样做:

  for i in 1..x_values_list.count loop
    dbms_output.put_line(x_values_list(i).id
     || ' ' x_values_list(i).x_1
     || ' ' x_values_list(i).x_2
     || ' ' x_values_list(i).x_3
     -- etc. for all the fields you want to display
    );
  end loop;

您可以使用dbms_sql来查询查询结果元数据(as shown here),但是这样做并不值得。


正如@hotfix在评论中提到的,过程的前两行:

  select Max(id) into square from table_name;
  x_values_list.extend(square*square+square);

毫无意义; bulk collect将完全替换集合的内容,您无需事先调整大小(扩展)。那不会给您带来问题,只是不需要。

在上面的循环中,我将1..square更改为1..x_values_list.count,所以它是基于批量获取后的实际集合大小;因此您根本不需要square局部变量。