2017-05-05 18 views
0

VARRAYの作成:ストア可変長配列[PL/SQL]

それを使用しようとすると
CREATE OR REPLACE TYPE ListaCursos IS VARRAY(10) OF Cursos; 

DECLARE 
    listaCursos1 ListaCursos; 
    c1 Cursos; 
    c2 Cursos; 
    p_ref REF Profesor; 
    p_ref2 REF Profesor; 
BEGIN 
    SELECT REF(p) INTO p_ref FROM Profesorado p WHERE p.codigo = 3; 
    c1 := NEW Cursos(1, 'Curso 1', p_ref, 20, '01/06/2011', '01/07/2011', 30); 
    SELECT REF(p) INTO p_ref2 FROM Profesorado p WHERE p.dni='51083099F'; 
    c2 := NEW Cursos(2, 'Curso 2', p_ref2, 20, '01/06/2011', '01/07/2011', 30); 
    listaCursos1 := ListaCursos(c1, c2); 
END; 
/

CREATE TABLE Alumnado OF Alumno; 

DECLARE 
    a1 Alumno; 
    a2 Alumno; 
    listaCursos1 ListaCursos; 
BEGIN 
    a1 := NEW Alumno(100, '76401092Z', 'MANUEL', 'SUAREZ IBAÑEZ', 'M', '30/6/1990', listaCursos1(1)); 
    a2 := NEW Alumno(102, '6915588V', 'MILAGROSA', 'DIAZ PEREZ', 'F', '28/10/1984', listaCursos1(2)); 
    INSERT INTO Alumnado VALUES (a1); 
    INSERT INTO Alumnado VALUES (a2); 
END; 
/

そして今では、このエラーを示していますで

DECLARE * ERROR 1行目: ORA-06531:初期化されていないコレクションへの参照 ORA-06512:6行目

+1

アクセスできます。 'listaCursos1(1)< - エラー'。 –

+0

他のブロックで初期化しましたが、どうすれば保存できますか? – EBG

+0

この値( 'listaCursos1')はどのくらい必要ですか?これらの挿入物のみ? –

答えて

1

パッケージ仕様を作成してください。

create package test_pkg 
is 
g_listaCursos1 ListaCursos; 
end; 

最初のブロックでパッケージ仕様から第2の読み出し値の

test_pkg.g_listaCursos1 := ListaCursos(c1, c2); 

を加えます。

test_pkg.g_listaCursos1(1) , test_pkg.g_listaCursos1(2)

制限:

  • パッケージ変数は、あなたが初期化されていないコレクションから読み取るしようとしている同じセッションで
+0

それは働いた!ありがとう! – EBG

0

PL/SQLブロック内で型を作成すると、そのブロック内でのみ型を使用できます。したがって、最初のブロック内に作成するVARRAYは、そのブロック内でのみ使用できます。データベースにドロップダウンするまでスタンドアロン型を作成するか、パッケージ内で型を作成し、型をパッケージから参照することができます。詳細については、Oracle Docs

+0

最初の投稿を編集しましたが、同じエラーが表示されます。 – EBG

+0

'ListaCursos'や' LISTACURSOS1'に間違いがありますか? – Nitish

+0

今私はそれが示す値を使用しようとします:識別子 'LISTACURSOS1'を宣言する必要があります。私がlistaCursos1 "listaCursos1 ListaCursos;を宣言していれば初期化されていないコレクションへの参照。最初の投稿を編集してコードを表示します。 – EBG