Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
Oracle 在PL/SQL中重置关联数组?_Oracle_Plsql - Fatal编程技术网

Oracle 在PL/SQL中重置关联数组?

Oracle 在PL/SQL中重置关联数组?,oracle,plsql,Oracle,Plsql,这是一个“一定有更好的方法”的问题。让我来解决这个问题,然后我会给你我的黑客解决方案,也许你可以建议一个更好的解决方案。谢谢 让我们来了解一下PL/SQL的一些小技巧 DECLARE TYPE foo_record IS RECORD (foo%type, bar%type); TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER; arr_foos foo_records; CURSOR monkeys is SEL

这是一个“一定有更好的方法”的问题。让我来解决这个问题,然后我会给你我的黑客解决方案,也许你可以建议一个更好的解决方案。谢谢

让我们来了解一下PL/SQL的一些小技巧

DECLARE
 TYPE foo_record IS RECORD (foo%type, bar%type);
 TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;
 arr_foos foo_records;

 CURSOR monkeys is SELECT primates FROM zoo;
 row_monkey monkeys%rowtype;
BEGIN
 FOR row_monkey IN monkeys loop
  /*
    at this point in each iteration I need to have the associative array 
    arr_foos in its original state. if this were java, I'd declare it 
    right here and its scope would be limited to this iteration. However, 
    this is not java, so the scope of the array is effectively global and 
    I can't have one iteration's data meddle with the next.
  */
  null;
 END LOOP;
END;
这有意义吗?我基本上需要将它重置为某个值。如果是一个从零开始的数字,我可以说:=0;在每一次迭代的顶部,你都可以完成它。但这不是一个数字,这是一种我可以用clean:=0重置的类型

不管怎样,我要说的是:

DECLARE
 TYPE foo_record IS RECORD (foo%type, bar%type);
 TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;
 arr_foos foo_records;
 arr_foos_reset foo_records;

 CURSOR monkeys is SELECT primates FROM zoo;
 row_monkey monkeys%rowtype;
BEGIN
 FOR row_monkey IN monkeys loop
  arr_foos := arr_foos_reset;
  null;
 END LOOP;
END;
我想,如果我能设法将同一类型的成员保持在原始状态,那么我就可以将工作变量设置回原始变量的任何值。而且,令人惊讶的是,它是有效的(我认为),但肯定有更好的方法。有人能帮忙吗

唐克斯

最简单的方法:

arr_foos.Delete();
另一种方法是在
FOR
循环中声明变量。这样,将为每个过程重新创建它

像这样:

DECLARE
 TYPE foo_record IS RECORD (foo%type, bar%type);
 TYPE foo_records IS TABLE OF foo_record INDEX BY PLS_INTEGER;     

 CURSOR monkeys is SELECT primates FROM zoo;
 row_monkey monkeys%rowtype;
BEGIN
 FOR row_monkey IN monkeys loop
  DECLARE
    arr_foos foo_records;
  BEGIN
    null;
  END;
 END LOOP;
END;

您要将zoo表中的数据读取到集合中吗?还有一个更好的方法:

DECLARE
  type foos_ts is table of zoo.foo%type index by pls_integer;
  foos foos_t;
BEGIN
  select foo
  bulk collect into foos
  from zoo;
  ...
END;
大容量收集在获取之前自动清除收集,其工作速度比在循环中逐行读取快。不幸的是,它不能处理记录,所以每个字段都需要几个PL/SQL表


您可以在此处找到更多信息:

谢谢!我不知道你可以在开始后说申报。(:您可以嵌套任意次数。这样您也可以在较小的代码块中捕获异常(如C#或Java中的try/catch)。我认为这是非常有用的功能。原因不是“您可以说在开始后声明”。可以将多个PL/SQL块嵌套在彼此中。次要挑剔:不需要声明
row\u%rowtype;
。像这样的循环游标为您进行声明,并且仅限于循环体。在这段代码中,变量声明两次,内部版本与外部版本之间存在阴影。这不是问题,不是吗hough–我想我应该为其他阅读者添加这个。聚会迟到了:幕后的“for row in cursor”语法也会导致批量收集,它会一次获取100条记录。缓慢的“逐行”获取只有在使用显式获取时才会发生。