返回首页

gbase数据、南大通用产品文档:GBase8sSQL 不透明数据类型

更新日期:2024年09月11日

不透明数据类型是用户定义的数据类型,可以与 GBase 8s 内置数据类型相同的方式
使用。不透明数据类型允许您为数据库应用程序定义新的数据类型。

不透明数据类型是完全封装的;数据库服务器不了解不透明数据类型的内部格式。因
此,数据库服务器无法对如何访问具有不透明数据类型的列进行假设。数据库开发人员定
义了一个数据结构。它保存了不透明类型的信息和支持功能,告诉数据库服务器如何访问
此数据结构。

可以通过以下两种方式之一从 GBase 8s ESQL/C 应用程序访问不透明数据类型的值:

在外部格式中,作为字符字符串

数据库服务器通过不透明数据类型的输入和输出支持功能,在客户端应用程序和数据
库服务器之间传输外部格式。

在内部格式中,作为外部编程语言(C)中的数据结构

数据库服务器通过不透明数据类型的结束和发送支持功能,在客户端应用程序和数据
库服务器之间传输内部格式。

下表显示了可用于访问不透明数据类型的 GBase 8s ESQL/C 数据类型。

GBase 8s 数据类型
ESQL/C 主机变量
不透明数据类型的外部格式
lvarchar 主机变量

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 256 -

不透明数据类型的内部格式
fixed binary 主机变量
var binary 主机变量

本节使用名为 circle 的不透明数据类型演示 GBase 8s ESQL/Clvarchar 和 fixed
binary 主机变量如何访问不透明数据类型。此数据类型包括 x,y 坐标,表示圆的中心半径
值。下图显示了 circle 数据类型的内部数据结构。

图 1. 圆不透明数据类型的内部数据结构

typedef struct
{
double x;
double y;
} point_t;

typedef struct
{
point_t center;
double radius;
} circle_t;

下图显示了数据库中注册 circle 数据类型及其输入、输出、发送和接收支持函数的
SQL 语句。

图 2. 注册 circle 不透明数据类型

CREATE OPAQUE TYPE circle (INTERNALLENGTH = 24,
ALIGNMENT = 4);

CREATE FUNCTION circle_in(c_in lvarchar) RETURNS circle
EXTERNAL NAME '/usr/lib/circle.so(circle_input)'
LANGUAGE C;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 257 -

CREATE IMPLICIT CAST (lvarchar AS circle WITH circle_in);

CREATE FUNCTION circle_out(c_out circle) RETURNS lvarchar
EXTERNAL NAME '/usr/lib/circle.so(circle_output)'
LANGUAGE C;
CREATE IMPLICIT CAST (circle AS lvarchar WITH circle_out);

CREATE FUNCTION circle_rcv(c_rcv sendrcv) RETURNS circle
EXTERNAL NAME '/usr/lib/circle.so(circle_receive)'
LANGUAGE C;
CREATE IMPLICIT CAST (sendrcv AS circle WITH circle_rcv);

CREATE FUNCTION circle_snd(c_snd circle) RETURNS sendrcv
EXTERNAL NAME '/usr/lib/circle.so(circle_send)'
LANGUAGE C;
CREATE IMPLICIT CAST (circle AS sendrcv WITH circle_snd);

CREATE FUNCTION radius(circle) RETURNS FLOAT
EXTERNAL NAME '/usr/lib/circle.so'
LANGUAGE C;

假设 circle 数据类型的输入和输出函数定义了下图所示的外部格式。

图 3. circle Opaque 数据类型的外部格式


下图显示了创建和插入多行到 circle_tab 表的 SQL 语句,它具有 circle 类型的列。


图 4. 创建具有 circle 不透明数据类型的列


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 258 -

CREATE TABLE circle_tab (circle_col circle);
INSERT INTO circle_tab VALUES ('(12.00, 16.00, 13.00)');
INSERT INTO circle_tab VALUES ('(6.5, 8.0, 9.0)');

示例
建表语句:
CREATE TABLE "test_4" (
"column_1" int(11) DEFAULT NULL,
"column_2" varchar(10) DEFAULT NULL,
"column_3" varchar(20)
DEFAULT NULL);
数据文件:
43452|sisoekso|mozoa,a
59432|gg|laqpqpd
03890|lqps,rpd|gg
加载过程:
gbase> LOAD DATA INFILE 'http://192.168.153.32/1.txt' INTO TABLE
test_4 FIELDS TERMINATED BY '|' MIN_CHUNK_SIZE 33554432;
Query OK, 3 rows affected (Elapsed: 00:00:00.31)
Task 252 finished, Loaded 3 records, Skipped 0 records
查询入库数据:
gbase> SELECT * FROM test_4;
+----------+----------+----------+
| column_1 | column_2 | column_3 |
+----------+----------+----------+
|
43452 | sisoekso | mozoa,a
|
|
3890 | lqps,rpd | gg
|
|
59432 | gg
| laqpqpd
|
+----------+----------+----------+
3 rows in set (Elapsed: 00:00:00.01)

这个例子调用print_boolean过程三次。第三次调用和第一次调用在逻辑上等价于第三
次调用中的圆括号,只提高了可读性。第二个调用中的括号将更改运算顺序。
DECLARE
x BOOLEAN := FALSE;
y BOOLEAN := FALSE;
BEGIN
print_boolean ('NOT x AND y', NOT x AND y);
print_boolean ('NOT (x AND y)', NOT (x AND y));
print_boolean ('(NOT x) AND y', (NOT x) AND y);
END;

--Result:
--NOT x AND y = FALSE
--NOT (x AND y) = TRUE

GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 32 -

--(NOT x) AND y = FALSE