0

我在这里找不到什么问题,最后我决定在这里寻求帮助。

这就是我调用的方式:

  DECLARE
   RESSULT VARCHAR2(1000 CHAR);
   V_TEST1 CARS_TABLE:=CARS_TABLE();
   idx pls_integer :=0;
   BEGIN 
   V_TEST1.EXTEND(2);
    IDX := V_TEST1.COUNT; -- here there is NO problem

  RESSULT:=MYFUNCTION(1, V_TEST1);
  END;

这就是我要调用的..

CREATE OR REPLACE
  FUNCTION MYFUNCTION(
  CAR_ID IN INTEGER,
  MYOUTTABLE OUT CARS_TABLE)
RETURN VARCHAR2
 IS
RESSULT VARCHAR2(1000 CHAR);
idx pls_integer :=0;
BEGIN
IDX := MYOUTTABLE.COUNT; - HERE IS PROBLEM.. but why - I pass initialized collection
RETURN 'return param';
END MYFUNCTION;


 CREATE OR REPLACE TYPE carElement
IS
OBJECT
 (
  kind VARCHAR2(60),
    created DATE );
CREATE OR REPLACE TYPE CARS_TABLE

作为 carElement 的表格;

  1. 00000 - “对未初始化集合的引用” *原因:在集合未初始化的情况下,引用了嵌套表或可变数组的元素或成员函数(需要初始化集合的地方)。*操作:使用适当的构造函数或整个对象赋值来初始化集合。
4

1 回答 1

2

“IDX := MYOUTTABLE.COUNT; - 这里有问题.. 但为什么 - 我通过了初始化集合”

您在函数调用的输入上将集合重置为 NULL,因为您已将参数定义为OUT在调用函数时自动将参数设为空(文档链接)。

 MYOUTTABLE OUT CARS_TABLE

如果要保留输入,则需要将其传递为,IN或者如果要保留输入并在函数中操作对象,则使用IN OUT.

例如,如果我使用,第一次调用它会显示它的 null out

SQL> declare
  2    v_test1 cars_table:=cars_table();
  3
  4    function myfunction(
  5      car_id in integer,
  6      myouttable  &mode cars_table)
  7    return varchar2
  8    is
  9      ressult varchar2(1000 char);
 10      idx pls_integer :=0;
 11    begin
 12      if (myouttable is null)
 13      then
 14        dbms_output.put_line('ARRAY IS NULL');
 15      else
 16        idx := myouttable.count;
 17      end if;
 18      return 'return param';
 19    end myfunction;
 20  begin
 21
 22    v_test1.extend(2);
 23    dbms_output.put_line(myfunction(1, v_test1));
 24
 25  end;
 26  /
Enter value for mode: OUT
old   6:     myouttable  &mode cars_table)
new   6:     myouttable  OUT cars_table)
ARRAY IS NULL
return param

PL/SQL procedure successfully completed.

SQL> /
Enter value for mode: IN OUT
old   6:     myouttable  &mode cars_table)
new   6:     myouttable  IN OUT cars_table)
return param

PL/SQL procedure successfully completed.
于 2013-03-20T17:11:46.550 回答