【问题标题】:Creating or simulating two dimensional arrays in PL/SQL在 PL/SQL 中创建或模拟二维数组
【发布时间】:2012-02-27 16:04:52
【问题描述】:

您能帮我在 PL/SQL 中为存储过程创建二维数组吗?这些列是动态的,因此它也可以增长和改变类型。 任何帮助表示赞赏。提前谢谢!

我有以下代码:

Type CAR_TABLE_ARRAY is varray(2) of varchar2(255);
TYPE CAR_TABLE_TYPE IS TABLE OF CAR_TABLE_ARRAY;
CAR_TABLE CAR_TABLE_TYPE;

CAR_TABLE := CAR_TABLE_TYPE();
CAR_TABLE.EXTEND(10);
CAR_TABLE(1)(1) := 'DODGE';
CAR_TABLE(2)(1) := 'FORD';
CAR_TABLE(3)(1) := 'MUSTANG';
CAR_TABLE(4)(1) := 'EDSEL';
CAR_TABLE(5)(1) := 'STUDEBAKER';

DBMS_OUTPUT.put_line( '1 ' || CAR_TABLE(1)(1) );
DBMS_OUTPUT.put_line( '2 ' || CAR_TABLE(2)(1) );
DBMS_OUTPUT.put_line( '3 ' || CAR_TABLE(3)(1) );
DBMS_OUTPUT.put_line( '4 ' || CAR_TABLE(4)(1) );
DBMS_OUTPUT.put_line( '5 ' || CAR_TABLE(5)(1) );

运行时出现以下错误:

ORA-06531:对未初始化集合的引用

【问题讨论】:

  • 二维数组在数学上只是一个映射 (X, Y) -> VALUE。那么,如何在 PL/SQL 中创建一个包含 3 列 X、Y、VALUE 的临时表?
  • 嗨 BycycleDude,感谢您的回复。但是我认为我无法创建临时表,因为列需要是动态的,因此它可以更改其列类型和列数。
  • 简单,只需创建一个TYPE 列并创建许多可为空的VALUE 列,然后只设置您需要的一个:X、Y、TYPE、VALUE_FLOAT、VALUE_STRING、VALUE_TIMESTAMP、VALUE_BLOB、。 ..

标签: sql arrays oracle plsql


【解决方案1】:

这是一个在 pl/sql 中使用多维数组的示例。这里我使用一个包含数组的数组。

declare

  type t_features is table of varchar(100) index by pls_integer;
  type t_car_rec is record
  (
    make varchar2(50),
    model varchar2(50),
    features t_features
  );

  type t_car_tab is table of t_car_rec index by pls_integer;
  car_tab t_car_tab;

  procedure show_detail is
    car_idx pls_integer;
    features_idx pls_integer;
  begin
    car_idx := car_tab.first;
    loop
      exit when car_idx is null;
      dbms_output.put_line('Details for ' || car_tab(car_idx).make || ' ' || car_tab(car_idx).model);

      features_idx := car_tab(car_idx).features.first;
      loop
        exit when features_idx is null;
        dbms_output.put_line('   =>' || car_tab(car_idx).features(features_idx));

        features_idx := car_tab(car_idx).features.next(features_idx);
      end loop;

      car_idx := car_tab.next(car_idx);
    end loop;
  end;

begin

  -- using sequential index values
  car_tab(1).make := 'Ferrari';
  car_tab(1).model := 'Testarossa';
  car_tab(1).features(1) := 'Fast';
  car_tab(1).features(2) := 'Looks cool';
  car_tab(1).features(3) := 'Expensive';

  -- using random index values (sparse)
  car_tab(2).make := 'Acura';
  car_tab(2).model := 'TSX';
  car_tab(2).features(14) := 'Small';
  car_tab(2).features(200) := 'Good MPG';
  car_tab(2).features(36) := 'Inexpensive';

  show_detail;

end;

输出将是:

Details for Ferrari Testarossa
  =>Fast
  =>Looks cool
  =>Expensive 
Details for Acura TSX
  =>Small
  =>Inexpensive
  =>Good MPG

希望有帮助

【讨论】:

    【解决方案2】:

    VARRAY 和嵌套表用户定义的数据类型始终必须使用构造函数进行初始化。您正在为嵌套表正确执行此操作,但不适用于它包含的 VARRAY。最简单的解决方法是在赋值行中调用构造函数:

    declare
        Type CAR_TABLE_ARRAY is varray(2) of varchar2(255);
        TYPE CAR_TABLE_TYPE IS TABLE OF CAR_TABLE_ARRAY;
        CAR_TABLE CAR_TABLE_TYPE;
    begin    
        CAR_TABLE := CAR_TABLE_TYPE();
        CAR_TABLE.EXTEND(10);
        CAR_TABLE(1) := CAR_TABLE_ARRAY('DODGE',null);
        CAR_TABLE(2) := CAR_TABLE_ARRAY('FORD',null);
        CAR_TABLE(3) := CAR_TABLE_ARRAY('MUSTANG',null);
        CAR_TABLE(4) := CAR_TABLE_ARRAY('EDSEL',null);
        CAR_TABLE(5) := CAR_TABLE_ARRAY('STUDEBAKER',null);
    
        DBMS_OUTPUT.put_line( '1 ' || CAR_TABLE(1)(1) );
        DBMS_OUTPUT.put_line( '2 ' || CAR_TABLE(2)(1) );
        DBMS_OUTPUT.put_line( '3 ' || CAR_TABLE(3)(1) );
        DBMS_OUTPUT.put_line( '4 ' || CAR_TABLE(4)(1) );
        DBMS_OUTPUT.put_line( '5 ' || CAR_TABLE(5)(1) );
    end;
    

    【讨论】:

      【解决方案3】:

      那是因为您引用了未初始化的内部数组。
      要么添加类似:

      CAR_TABLE(1) := CAR_TABLE_ARRAY();
      CAR_TABLE(1).EXTEND(1);
      CAR_TABLE(2) := CAR_TABLE_ARRAY();
      CAR_TABLE(2).EXTEND(1);
      ...
      

      或将内部数组 (CAR_TABLE_ARRAY) 设为关联数组:

      Type CAR_TABLE_ARRAY is TABLE of varchar2(255) index by binary_integer;
      

      【讨论】:

        猜你喜欢
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 2016-12-27
        • 1970-01-01
        • 2011-10-19
        相关资源
        最近更新 更多