Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PL/SQL中使用游标打印前100个值_Sql_Oracle_Plsql - Fatal编程技术网

在PL/SQL中使用游标打印前100个值

在PL/SQL中使用游标打印前100个值,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试使用游标打印字段的前100个值。但我在这里遇到了ORA-06550错误。有人能告诉我我缺少了什么吗 Declare BG_TOTAL number; cursor c1 is select BG_ID from <tablename>; Type BG_TAB_TYPE is table of c1%ROWTYPE; BG_LIST BG_TAB_TYPE; Begin open c1; FETCH c1 BULK

我正在尝试使用游标打印字段的前100个值。但我在这里遇到了ORA-06550错误。有人能告诉我我缺少了什么吗

Declare 
  BG_TOTAL number;

  cursor c1 is 
    select BG_ID 
      from <tablename>;

  Type BG_TAB_TYPE is table of  c1%ROWTYPE;

  BG_LIST BG_TAB_TYPE;

Begin
  open c1;
  FETCH c1 BULK COLLECT INTO BG_LIST;

  close c1;

   for i in 1..c1.count    
   loop
     DBMS_OUTPUT.PUT_LINE(c1(i).BG_ID);
   End loop;  
end;
声明
BG_总数;
光标c1为
选择BG_ID
从…起
类型BG_TAB_Type是c1%行类型的表;
BG_列表BG_选项卡类型;
开始
开c1;
将c1批量收集到BG_列表中;
关闭c1;
对于1..c1.计数中的i
环
DBMS_OUTPUT.PUT_LINE(c1(i).BG_ID);
端环;
结束;

您应该在批量收集记录的嵌套表中循环,而不是通过游标循环。这是正确的代码:

Declare 
  BG_TOTAL number;

  cursor c1 is 
    select BG_ID 
      from my_Tab524;

  Type BG_TAB_TYPE is table of  c1%ROWTYPE;

  BG_LIST BG_TAB_TYPE;

Begin
  open c1;
  FETCH c1 BULK COLLECT INTO BG_LIST;

  close c1;

   for i in 1..BG_LIST.count    
   loop
     DBMS_OUTPUT.PUT_LINE(BG_LIST(i).BG_ID);
     EXIT WHEN i = 10;
   End loop;  
end;

另一种选择是使用
批量收集
限制

这很好地分离了内容、限制和处理。在您的案例中,分离可能不是一个问题,但我发现这一点非常有用(帮助我编写更易于测试的模块化代码)


谢谢但是,如何指定要打印到的记录数呢。假设我只想打印前10行。@Nathan限制光标返回的行数。或者只批量收集其中的10个。或者在循环中指定1..10(注意当查询返回的记录少于10条时的情况),或者在循环中使用一个计数器,在打印每个记录后将其增加1,并在\u计数器>10时退出。柜台补充道。
declare
  -- data content
  cursor tables_c is select * from all_tables;
  type table_list_t is table of tables_c%rowtype;

  v_table_list table_list_t;
begin
  open tables_c;

  -- limiting the data set
  fetch tables_c bulk collect into v_table_list limit 8;

  -- processing
  for i in 1 .. v_table_list.count loop
    dbms_output.put_line(v_table_list(i).table_name);
  end loop;

  close tables_c;
end;
/