【问题标题】:PL/SQL Record and Table Variables inchangedPL/SQL 记录和表变量已更改
【发布时间】:2018-06-27 00:53:14
【问题描述】:

我是 Oracle PL/SQL 的新手,我被要求修改一些代码。我一直在查看 oracle 文档,并认为我知道它在做什么,但想验证我的理解是否正确。

代码如下:

TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);

v_closes_sc   array_rec_type;

TYPE v_sc_type is TABLE OF v_closes_sc%TYPE INDEX BY BINARY_INTEGER;

sc_array  v_sc_type;

这是我认为在这里声明的内容:

  • TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);
    • 似乎正在使用 tblName 表中 id 列中的列类型声明一个集合。可以是数字或 UUID 等。
  • v_closes_sc array_rec_type;
    • 正在创建新创建类型的变量
  • 类型 v_sc_type 是 v_closes_sc%TYPE INDEX BY BINARY_INTEGER 的表;
    • 正在使用先前为表创建模板的集合(记录)创建新类型。该表将包含一列 ID。
  • sc_array v_sc_type;
    • 正在创建一个新变量来保存新的表变量。

【问题讨论】:

    标签: oracle plsql oracle12c


    【解决方案1】:

    记录不是集合,因此您的解释有些混乱。 From the docs(你可能已经看过了:

    集合中,内部组件始终具有相同的数据类型,称为元素。 ...要创建集合变量,您可以定义一个集合类型,然后创建该类型的变量,或者使用%TYPE

    记录中,内部组件可以有不同的数据类型,称为字段。您可以通过名称访问记录变量的每个字段...要创建记录变量,您可以定义RECORD 类型,然后创建该类型的变量,或者使用%ROWTYPE%TYPE

    所以看看你说的:

    这是我认为在这里声明的内容:

    TYPE array_rec_type IS RECORD (gla_sub tblName.id%type);
    

    这是一个记录,而不是一个集合。在这种情况下,它有一个名为gla_sub 的字段,它确实是使用tblName 表中的id 列的数据类型声明的。使用%type 意味着,在某种程度上,您不需要知道实际的数据类型是什么,并且如果发生更改,您可能不必更改代码(如果varchar2 列的大小是增加,例如)。

    v_closes_sc array_rec_type;
    

    正确 - 正在创建新创建类型的变量。

    TYPE v_sc_type is TABLE OF v_closes_sc%TYPE INDEX BY BINARY_INTEGER;
    

    这个一个集合,特别是一个associative array。它是一个稀疏数组,其成员是上面声明的记录类型的实例,具有数字索引。也可以直接使用类型声明,如下:

    TYPE v_sc_type is TABLE OF array_rec_type INDEX BY BINARY_INTEGER;
    
    sc_array v_sc_type;
    

    正确 - 正在为刚刚声明的表类型创建一个新变量。


    拥有一个包含单个字段的记录类型似乎有点毫无意义,因为您可以拥有一个基于表列数据类型的集合。不过,您现有的代码将期待这种结构,因此更改它并不是一件容易的事。

    【讨论】:

    • 感谢您的详细回答。
    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多