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)
|
CLOB | 48 M | (4 GB - 1)
|
当赋值长度超过变量定义的长度时, 数据库会出现异常。
obclient> DECLARE
-> mychar VARCHAR2(3 CHAR);
-> BEGIN
-> mychar := 'abc ';
-> END;
-> /
ORA-06502: PL/SQL: numeric or value error
对于字符串类型的对象,可以使用函数 RTRIM() 去除字符串后面的连续空格,如下例所示:
obclient> DECLARE
-> mychar VARCHAR2(3 CHAR);
-> BEGIN
-> mychar := rtrim('abc ');
-> END;
-> /
Query OK, 0 rows affected (0.01 sec)
%TYPE
使用 %TYPE 定义一个变量与已经定义的某个数据变量的数据类型相同,或者与数据表某列的数据类型相同。
使用 %TYPE 特性的优点如下:
所引用的数据库列的数据类型可以是未知的
变量类型会跟随对应列的数据类型而改变
示例如下:
obclient> DECLARE
-> -- 用 %TYPE 类型定义与表相配的字段
-> TYPE T_REC IS RECORD(
-> T_id employees.employee_id%TYPE,
-> T_name employees.first_name%TYPE,
-> T_sal employees.salary%TYPE );
-> -- 声明接收数据的变量
-> V_emp T_REC;
-> BEGIN
-> SELECT employee_id, first_name, salary INTO V_emp FROM employees WHERE employee_id=101;
-> DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_emp.T_id)||': '||V_emp.T_name||': '||TO_CHAR(V_emp.T_sal));
-> END;
-> /
Query OK, 0 rows affected (0.04 sec)
101: Neena: 17000
%ROWTYPE
OceanBase 数据库 PL 提供 %ROWTYPE 操作符,用于返回某个记录类型, 其数据类型和数据库表的数据结构一致。
使用 %TYPE 特性的优点如下:
所引用表的列的个数和数据类型可以是未知的
记录的类型会跟随表结构的变化
除了应用与表之外,%ROWTYPE 操作符同样适用于静态游标,同义词和视图。
示例如下:
obclient> DECLARE
-> V_COUNTRY countries%ROWTYPE;
-> BEGIN
-> SELECT * INTO V_COUNTRY FROM countries
-> WHERE country_name='Argentina';
-> DBMS_OUTPUT.PUT_LINE('The Abbreviation of '||V_COUNTRY.country_name||' is '||V_COUNTRY.country_id);
-> END;
-> /
Query OK, 0 rows affected (0.05 sec)
The Abbreviation of Argentina is AR