美文网首页
PostgreSQL Oracle(PL/SQL) 兼容性之ty

PostgreSQL Oracle(PL/SQL) 兼容性之ty

作者: 宅家学算法 | 来源:发表于2018-05-08 15:52 被阅读0次

    背景

     当在处理数据过程中需要返回多个类型的数据时,自定义一个包含多种类型数据的类型就极为方便(参考结构)

    oracle

     定义记录数据类型。它类似于C语言中的结构数据类型(STRUCTURE),PL/SQL提供了将几个相关的、分离的、基本数据类型的变量组成一个整体的方法,即RECORD复合数据类型。在使用记录数据类型变量时,需要在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。
     自定义类型有两种创建方式:type和create type
      相同点:可用关键字create type或者直接用type定义自定义类型
      区别:create后面用as,type后面用is;create创建的是object,type创建的是record;type用在语句块中,create是独立的
    注意:type是局部类型,create type是全局类型

    create type 变量 as table of 类型
    create type 变量 as object(字段1 类型,字段2 类型)
    

    示例

    CREATE OR REPLACE TYPE "STRU" as object(
      v_slno number(12,0),  --站点序号
      v_reportdate date,  --进站时间
      v_length number,  --最长序列的长度
      v_dateOrder DateOrder--该序列对应的时间序列
    );
    type 变量 is table of 类型
    type 变量 is record(字段1 类型, 字段2 类型)     
    type rec_cjr is record
    (
        cjrid varchar2(30)
    );
    

    注意:type ··· is table of 类似一个二维数组(index by binary_integer自增长下标)

    PostgreSQL

     postgresql 的type定义需要在数据库中定义,而不是函数中定义,可理解为postgresql中的type只可以定义全局类型 。CREATE TYPE 为当前数据库注册一个新的数据类型。定义该类型的用户成为其所有者

    示例

    create TYPE STRU as(
      v_slno int,  --站点序号
      v_reportdate timestamp,  --进站时间
      v_length int,  --最长序列的长度
      v_dateOrder timestamp array[500]--该序列对应的时间序列
    (注意: 类型Struts中的v_dateOrder不能直接修改,必须创建一个同类型的临时变量作为标量,修改标量后赋值 )
    );
    

    注意:postgreql中不可以直接用type定义,需用create type;即postgresql不能在函数体内定义内型,需在函数体外定义类型;由于PostgreSQL的type是全局的,这个也需要注意,如果多个PL/SQL函数用到了同样的type name但是结构不一样,移植到到plpgsql时,需要创建多个type,在plpgsql中分别使用对应的类型名(即类型名不能相同,且类型名不能和表名相同)。

    应用状况

    orcale

    type rec_cjr is record
    (
        cjrid varchar2(30) ,
        tk integer
    );
    type cjr is table of rec_cjr index by binary_integer;
    

    postgresql

    create type rec_cjr is record
    
    (
       cjrid varchar2(30) ,
       tk integer
    );
    cjr rec_cjr array;
    

    小结:

     1. postgresql使用array替代了PL/SQL的table定义。

     2. 复合类型的数组,不能直接修改复合类型的element,需要先用标量修改好后赋值。

     3.PL/SQL的type是局部变量,而PostgreSQL的type是全局的,这个也需要注意,如果多个PL/SQL函数用到了同样的类型但是结构不一样,迁移到plpgsql时,需要创建多个类型,在plpgsql中分别使用对应的类型名(即类型名不能相同)。如果给出模式名,那么该类型是在指定模式中创建。否则它将在当前模式中创建。类型名必需和同一模式中任何现有的类型或者域不同。因为表和数据类型有联系,所以类型名也不能和同模式中的表名字冲突。

    相关文章

      网友评论

          本文标题:PostgreSQL Oracle(PL/SQL) 兼容性之ty

          本文链接:https://www.haomeiwen.com/subject/gqhwrftx.html