8.22. Oracle兼容数据类型

8.22.1. VARCHAR2
8.22.2. NVARCHAR2
8.22.3. 日期
8.22.4. RAW
8.22.5. PLS_INTEGER
8.22.6. BINARY_FLOAT
8.22.7. BINARY_DOUBLE
8.22.8. XMLType

支持以下数据类型:

8.22.1. VARCHAR2

语法

指定VARCHAR2类型如下。

Table 8.28. VARCHAR2语法

数据类型语法

说明

VARCHAR2(len [byte|char])

变长字符串,最多可包含len个字符。 对于len,请指定大于0的整数。 如果省略len,则字符串可以是任意长度。 自23.1版本以来,LightDB实现了此语法,以兼容Oracle的varchar2类型。 在len后面的关键字bytechar是可选的,仅与Oracle语法兼容, 内部实现与只有len而没有bytechar关键字的实现相同。


通用规则

  • VARCHAR2是一种字符数据类型。请指定长度所需的字符数。

  • 字符串长度可变。指定的值将被存储为原样。 此数据类型的上限约为1GB。

注意

VARCHAR2类型不支持排序序列。因此,在需要类似于ORDER BY子句的排序序列时, 会发生以下错误。此时,以下提示将提示使用COLLATE子句, 但是,由于不支持排序序列,因此无法使用此子句。

    ERROR:   could not determine which collation to use for string comparison
    HINT:   Use the COLLATE clause to set the collation explicitly.
   

如果显示了上面显示的错误,请将列显式转换为VARCHAR或TEXT类型。

示例

lightdb@postgres=# create table t1(name varchar2(10));
CREATE TABLE
lightdb@postgres=#
lightdb@postgres=# \d+ t1
                                       Table "public.t1"
 Column |     Type     | Collation | Nullable | Default | Storage | Stats target | Description
--------+--------------+-----------+----------+---------+---------+--------------+-------------
 name   | varchar2(10) |           |          |         | plain   |              |
Access method: heap

lightdb@postgres=#
lightdb@postgres=# create table t2(name varchar2(10 byte));
CREATE TABLE
lightdb@postgres=#
lightdb@postgres=# \d+ t2
                                       Table "public.t2"
 Column |     Type     | Collation | Nullable | Default | Storage | Stats target | Description
--------+--------------+-----------+----------+---------+---------+--------------+-------------
 name   | varchar2(10) |           |          |         | plain   |              |
Access method: heap

lightdb@postgres=#
lightdb@postgres=# create table t3(name varchar2(10 char));
CREATE TABLE
lightdb@postgres=#
lightdb@postgres=# \d+ t3
                                       Table "public.t3"
 Column |     Type     | Collation | Nullable | Default | Storage | Stats target | Description
--------+--------------+-----------+----------+---------+---------+--------------+-------------
 name   | varchar2(10) |           |          |         | plain   |              |
Access method: heap

lightdb@postgres=#
   

8.22.2. NVARCHAR2

语法

指定NVARCHAR2类型如下。

Table 8.29. NVARCHAR2语法

数据类型语法

解释

NVARCHAR2(len)

变长国家字符字符串,最多可包含len个字符。 对于len,请指定大于0的整数。 如果省略len,则字符串可以是任意长度。


通用规则

  • NVARCHAR2是一种国家字符数据类型。请指定长度所需的字符数。

  • 字符串长度可变。指定的值将被存储为原样。 此数据类型的上限约为1GB。

注意

NVARCHAR2类型不支持排序序列。因此,在需要类似于ORDER BY子句的排序序列时, 会发生以下错误。此时,以下提示将提示使用COLLATE子句, 但是,由于不支持排序序列,因此无法使用此子句。

    ERROR:   could not determine which collation to use for string comparison
    HINT:   Use the COLLATE clause to set the collation explicitly.
   

如果显示了上面显示的错误,请将列显式转换为NCHAR VARYING或TEXT类型。

8.22.3. 日期

语法

指定DATE类型如下。

Table 8.30. 日期语法

数据类型语法

解释

DATE

存储日期和时间


通用规则

  • DATE是一种日期/时间数据类型。

  • 日期和时间存储在DATE中。时区不会被存储。

注意

如果在DDL语句(如表定义)中使用orafce的DATE类型,请在执行DDL语句之前始终设置search_path。 即使在定义之后更改了search_path,数据类型也将是LightDB的DATE类型。

信息

orafce的DATE类型等同于LightDB的TIMESTAMP类型。 因此,可以使用参数数据类型为TIMESTAMP的现有LightDB函数。

8.22.4. RAW

语法

指定 RAW 类型如下。

Table 8.31. RAW 语法

RAW 类型语法

解释

RAW(len)

存储可变长度的二进制数据。外部表示为十六进制。 len 只是为了与 Oracle 兼容,没有实际作用。 二进制数据可以是任意长度。


通用规则

  • RAW 是一个可变长度的十六进制数据类型。

  • 十六进制字符串长度可变。指定的值将被存储为二进制数据。此数据类型的上限约为 1GB。

8.22.5. PLS_INTEGER

语法

指定 PLS_INTEGER 类型如下。

Table 8.32. PLS_INTEGER 语法

PLS_INTEGER 类型语法

解释

PLS_INTEGER

PLS_INTEGER 数据类型以 32 位表示带符号整数,范围为 -2,147,483,648 到 2,147,483,647。


通用规则

  • PLS_INTEGER 类似于 int4。

8.22.6. BINARY_FLOAT

语法

指定 BINARY_FLOAT 类型如下。

Table 8.33. BINARY_FLOAT 语法

BINARY_FLOAT 类型语法

解释

BINARY_FLOAT

BINARY_FLOAT是一种32位单精度浮点数的数据类型。每个BINARY_FLOAT值需要4个字节。


通用规则

  • BINARY_FLOAT 类似于 float4.

  • 与oracle相同,都遵循IEEE754标准。

例子

lightdb@test_o=# create table t1(key1 binary_float);
CREATE TABLE
lightdb@test_o=# \d+ t1
                                       Table "public.t1"
 Column |     Type      | Collation | Nullable | Default | Storage | Sta
ts target | Description
--------+---------------+-----------+----------+---------+---------+----
----------+-------------
 key1   | binary_float |           |          |         | plain   |
          |
Access method: heap
lightdb@test_o=# insert into t1 values(123456789012345678901234567890123456789);
INSERT 0 1
lightdb@test_o=# insert into t1 values('infinity');
INSERT 0 1
lightdb@test_o=# insert into t1 values('NaN');
INSERT 0 1
lightdb@test_o=# select * from t1;
     key1
---------------
 1.2345679e+38
      Infinity
           NaN
(3 rows)
   

8.22.7. BINARY_DOUBLE

语法

指定 BINARY_DOUBLE 类型如下。

Table 8.34. BINARY_DOUBLE 语法

BINARY_DOUBLE 类型语法

解释

BINARY_DOUBLE

BINARY_DOUBLE是一种64位双精度浮点数的数据类型。每个BINARY_DOUBLE值需要8个字节。


通用规则

  • BINARY_DOUBLE 类似于 float8。

  • 与oracle相同都遵循IEEE754标准。

例子

lightdb@test_o=# create table t1(key1 binary_double);
CREATE TABLE
lightdb@test_o=# \d+ t1
                                       Table "public.t1"
 Column |     Type      | Collation | Nullable | Default | Storage | Sta
ts target | Description
--------+---------------+-----------+----------+---------+---------+----
----------+-------------
 key1   | binary_double |           |          |         | plain   |
          |
Access method: heap
lightdb@test_o=# insert into t1 values(123456789012345678901234567890123456789);
INSERT 0 1
lightdb@test_o=# insert into t1 values('infinity');
INSERT 0 1
lightdb@test_o=# insert into t1 values('NaN');
INSERT 0 1
lightdb@test_o=# select * from t1;
          key1
------------------------
 1.2345678901234568e+38
               Infinity
                    NaN
(3 rows)
   

8.22.8. XMLType

语法

按如下方式指定XMLType类型。

Table 8.35. XMLType 语法

XMLType 语法

解释

XMLType

XMLType是一个对象类型,可以用来存储XML数据。


通用规则

  • XMLType是xml数据类型。

  • 支持oracle.XMLType和pg_catalog.xml之间的隐式转换。

成员函数

  • function getClobVal() return CLOB

    以文本形式返回XML

例子

             
    lightdb@postgres=# create database test_oracle lightdb_syntax_compatible_type oracle;
    CREATE DATABASE

    lightdb@postgres=# \c test_oracle
    You are now connected to database "test_oracle" as user "lightdb".
    compatible type: oracle

    lightdb@test_oracle=# select dbms_output.serveroutput(true);
    serveroutput
    --------------

    (1 row)


    lightdb@test_oracle=# CREATE TABLE xml_table (id NUMBER, xml_column XMLType );
    CREATE TABLE

    lightdb@test_oracle=# INSERT INTO xml_table (id, xml_column) VALUES (1, XMLType('<root><name>John</name></root>'));
    INSERT 0 1

    lightdb@test_oracle=# DECLARE
    lightdb@test_oracle$#   v_clob CLOB;
    lightdb@test_oracle$# BEGIN
    lightdb@test_oracle$#   SELECT XMLType.getClobVal(xml_column)
    lightdb@test_oracle$#   INTO v_clob
    lightdb@test_oracle$#   FROM xml_table
    lightdb@test_oracle$#   WHERE id = 1;
    lightdb@test_oracle$#   DBMS_OUTPUT.PUT_LINE('CLOB value: ' || v_clob);
    lightdb@test_oracle$# END;
    lightdb@test_oracle$# /
    CLOB value: <root><name>John</name></root>
    DO

    lightdb@test_oracle=# DECLARE
    lightdb@test_oracle$#   xml_data XMLType;
    lightdb@test_oracle$#   clob_data CLOB;
    lightdb@test_oracle$# BEGIN
    lightdb@test_oracle$#   xml_data := XMLType('<root><name>John Doe</name></root>');
    lightdb@test_oracle$#   clob_data := xml_data.getClobVal();
    lightdb@test_oracle$#   DBMS_OUTPUT.PUT_LINE(clob_data);
    lightdb@test_oracle$# END;
    lightdb@test_oracle$# /
    <root><name>John Doe</name></root>
    DO

    lightdb@test_oracle=# SELECT XMLType.getClobVal(xml_column) from xml_table;
    getclobval
    --------------------------------
    <root><name>John</name></root>
    (1 row)