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

AS TABLE OF carElement;

  1. 00000 - 「初期化されていないコレクションへの参照」 *原因: コレクションが初期化されていない状態で、(初期化されたコレクションが必要な場合に)ネストした表またはVARRAYの要素またはメンバー関数が参照されました。*処置: 適切なコンストラクタまたはオブジェクト全体の割当てでコレクションを初期化してください。
4

1 に答える 1

2

「IDX := MYOUTTABLE.COUNT; - ここに問題があります..しかし、なぜ - 初期化されたコレクションを渡します」

OUT関数を呼び出すときにパラメーターを自動的に null にするパラメーターを定義したため、関数呼び出しへの入力でコレクションを NULL にリセットしています(ドキュメント リンク)。

 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 に答える