SQL 支持的数据类型可以在 PL 中直接使用,区别是个别变量的长度限制与 SQL 中略有不同。SQL 数据类型信息请参考官网《OceanBase SQL 参考手册》。

下表列出了 PL 和 SQL 中最大长度不同的的数据类型:

Data Type

PL 的长度上限

SQL 的长度上限

VARCHAR2

32,767 bytes

4,000 bytes

NVARCHAR2

32,767 bytes

4,000 bytes

BLOB

48 M

(4 GB - 1)

database_block_size

CLOB

48 M

(4 GB - 1)

database_block_size

当赋值长度超过变量定义的长度时, 数据库会出现异常。

  1. obclient> DECLARE
  2. -> mychar VARCHAR2(3 CHAR);
  3. -> BEGIN
  4. -> mychar := 'abc ';
  5. -> END;
  6. -> /
  7. ORA-06502: PL/SQL: numeric or value error

对于字符串类型的对象,可以使用函数 RTRIM() 去除字符串后面的连续空格,如下例所示:

  1. obclient> DECLARE
  2. -> mychar VARCHAR2(3 CHAR);
  3. -> BEGIN
  4. -> mychar := rtrim('abc ');
  5. -> END;
  6. -> /
  7. Query OK, 0 rows affected (0.01 sec)

%TYPE

使用 %TYPE 定义一个变量与已经定义的某个数据变量的数据类型相同,或者与数据表某列的数据类型相同。

使用 %TYPE 特性的优点如下:

  • 所引用的数据库列的数据类型可以是未知的

  • 变量类型会跟随对应列的数据类型而改变

示例如下:

  1. obclient> DECLARE
  2. -> -- %TYPE 类型定义与表相配的字段
  3. -> TYPE T_REC IS RECORD(
  4. -> T_id employees.employee_id%TYPE,
  5. -> T_name employees.first_name%TYPE,
  6. -> T_sal employees.salary%TYPE );
  7. -> -- 声明接收数据的变量
  8. -> V_emp T_REC;
  9. -> BEGIN
  10. -> SELECT employee_id, first_name, salary INTO V_emp FROM employees WHERE employee_id=101;
  11. -> DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_emp.T_id)||': '||V_emp.T_name||': '||TO_CHAR(V_emp.T_sal));
  12. -> END;
  13. -> /
  14. Query OK, 0 rows affected (0.04 sec)
  15. 101: Neena: 17000

%ROWTYPE

OceanBase 数据库 PL 提供 %ROWTYPE 操作符,用于返回某个记录类型, 其数据类型和数据库表的数据结构一致。

使用 %TYPE 特性的优点如下:

  • 所引用表的列的个数和数据类型可以是未知的

  • 记录的类型会跟随表结构的变化

除了应用与表之外,%ROWTYPE 操作符同样适用于静态游标,同义词和视图。

示例如下:

  1. obclient> DECLARE
  2. -> V_COUNTRY countries%ROWTYPE;
  3. -> BEGIN
  4. -> SELECT * INTO V_COUNTRY FROM countries
  5. -> WHERE country_name='Argentina';
  6. -> DBMS_OUTPUT.PUT_LINE('The Abbreviation of '||V_COUNTRY.country_name||' is '||V_COUNTRY.country_id);
  7. -> END;
  8. -> /
  9. Query OK, 0 rows affected (0.05 sec)
  10. The Abbreviation of Argentina is AR