【问题标题】:Store Varray [PL/SQL]存储 Varray [PL/SQL]
【发布时间】:2017-05-05 10:54:10
【问题描述】:

创建可变数组:

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;
/

现在它显示了这个错误:

声明 * 第 1 行的错误: ORA-06531: 对未初始化集合的引用 ORA-06512: 在第 6 行

【问题讨论】:

  • 您正在尝试从未初始化的集合中读取。 listaCursos1(1) <- error.
  • 我在另一个块中初始化了它,我该如何存储它?
  • 你需要这个值多久(listaCursos1)?仅适用于这些插入?
  • 我需要在其他块中使用它们。
  • 我已经添加了答案但我建议重新设计您的代码并简化它。

标签: plsql


【解决方案1】:

创建包规范。

create package  test_pkg 
is 
 g_listaCursos1 ListaCursos; 
end; 

在第一个块中添加

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

在第二次从包规范中读取值。

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

限制:

  • 包变量可以在同一个会话中访问

【讨论】:

    【解决方案2】:

    如果您在 PL/SQL 块内创建类型,则它仅在该块内可用。因此,您在第一个块内创建的VARRAY 仅在该块内可用。您可以创建一个独立的类型,该类型将存储在数据库中直到您删除它,或者您可以在包中创建一个类型并通过包引用该类型。更多信息可以阅读Oracle Docs

    【讨论】:

    • 您现在收到ListaCursos 或LISTACURSOS1 的错误了吗?
    • 现在当我尝试使用它显示的值时:必须声明标识符'LISTACURSOS1'。如果我声明 listaCursos1 "listaCursos1 ListaCursos;"它显示:引用未初始化的集合。我将编辑第一篇文章以显示代码。
    猜你喜欢
    • 2016-02-10
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多