返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

增加列DDL 时正常同步数据.....................错误!未定义书签。

PG_COLLATION 系统表描述可用的排序规则,
本质上从一个SQL 名称映射到操作系统
本地类别。
名称
类型
引用
描述
oid
oid
-
行标识符(隐含属性,必须明确
选择)。
collname
name
-
排序规则名(每个名称空间和编
码唯一)。
collnamespace
oid
PG_NAMESPACE.oid
包含这个排序规则的名称空间的
OID。
collowner
oid
PG_AUTHID.oid
排序规则的所有者。
collencoding
integer
-
排序规则可用的编码,兼容Post
greSQL 所有的字符编码类型,如
果适用于任意编码为-1。
collcollate
name
-
这个排序规则对象的LC_COLLA
TE。
collctype
name
-
这个排序规则对象的LC_CTYP

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
776
名称
类型
引用
描述
E。
须知:
consrc 在被引用的对象改变之后不会被更新,
它不会跟踪字段的名称修改。与其依赖这
个字段,最好还是使用pg_get_constraintdef()来抽取一个检查约束的定义。
pg_class.relchecks 需要和在此表上为给定关系找到的检查约束的数目一致。

当您在下列条件之下执行 SQL 语句时,请考虑动态管理结构:
关于 SQL 语句的结构,有些情况是未知的:
要执行的语句的类型是未知的。
表名称是未知的,因此,要访问的列是未知的。
找不到 WHERE 子句。
关于在 GBase 8s ESQL/C 程序与数据库服务器之间传递的值的数目或类型,有些情

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

况是未知的:
在 SELECT 的选择列表中,或在 INSERT 的列列表中的列的数目和数据类型
在该语句中输入参数的数目和数据类型是未知的
(以 EXECUTE FUNCTION 语句执行的)用户定义的函数的返回值的数目和数据类
型是未知的。
处理未知的选择列表
对于 SELECT 语句,选择列表中的列标识从数据库服务器接收的列值。在
demo1.ec 示例程序中描述和说明的 SELECT 语句中,将从该查询返回的值放置
至主变量内,该主变量罗列在该 SELECT 语句的 INTO host_var 子句中。

然而,当您的程序在运行时刻创建 SELECT 语句时,您不可使用 INTO 子句,因为
在编译时刻,您不知道需要什么主变量。在编译时刻,如果您的 GBase 8s ESQL/C 程序接
收的值的类型和数目是未知的,则您的程序必须执行下列任务:
声明动态管理结构来作为选择列表列定义的存储。此结构可为系统描述符区域,也可
为 sqlda 结构。
系统描述符区域的使用符合 X/Open 标准。

使用 DESCRIBE 语句来检测准备好的 SELECT 语句的选择列表,并描述这些列。
指定该动态管理结构作为从该数据库访存的数据的位置。该程序可将列值从该动态管
理结构移至主变量内。

重要: 在编译时刻,仅当您不知道选择列表列的数目和数据类型时,请使用动态管
理结构。
处理未知的列列表
对于 INSERT 语句,
VALUES 子句中的值标识要插入至新行内的列值。
在编译时刻,
如果 GBase 8s ESQL/C 程序插入的值的数据类型和数目是未知的,
则您不可简单地使用主
变量来保存正被插入的数据。反而,您的程序必须执行下列任务:
定义动态管理结构来作为位置的列定义的存储。此结构可为系统描述符区域,也可为
sqlda 结构。
系统描述符区域的使用符合 X/Open 标准。

使用 DESCRIBE 语句来检测该准备好的 INSERT 语句的列列表,并描述这些列。
当 INSERT 语句执行时,指定动态管理结构作为要插入的数据的位置。


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

重要: 在编译时刻,仅当您不知道列列表列的数目和数据类型时,才使用动态
管理结构。
确定未知的输入参数
如果您知道 SQL 语句的输入参数的数据类型和数目,则请使用 USING
host_var 子句。然而,如果在编译时刻您不知道这些输入参数的数据类型和数
目,则您不可使用主变量来提供该参数值;您没有关于该参数的充分的信息来
声明主变量。

您也不可使用 DESCRIBE 语句来定义未知的参数,因为 DESCRIBE 不检测:
WHERE 子句(对于 SELECT、UPDATE 或 DELETE 语句)
用户定义的例程的参数(对于 EXECUTE FUNCTION 或 EXECUTE PROCEDURE
语句)

您的 GBase 8s ESQL/C 程序必须按照这些步骤来定义任何上述语句中的输入参数:
确定输入参数的数目和数据类型。除非您编写通用目的的、交互的翻译器,否则,您
总是有此信息。如果您没有它,则您必须编写 C 分析该语句字符串的代码,并获得下列信
息:
出现在该语句字符串的 WHERE 子句中的输入参数 [问号(?)]的数目,或作为用户
定义的例程的参数
基于它与其对应的列(对于 WHERE 子句)或参数(对于参数)的每一输入参数的
数据类型
存储定义和在动态管理结构中的输入参数的值。此结构可为系统描述符区域,也可为
sqlda 结构。
系统描述符区域的使用符合 X/Open 标准。

当该语句执行时,指定动态管理结构作为输入参数值的位置。

重要: 在编译时刻,仅当您不知道输入参数的数目和数据类型时,请使用动态
管理结构。
动态地确定返回值
对于 EXECUTE FUNCTION 语句,
在 INTO 子句中的值标识将用户定义的函数的返
回值存储在哪里。在编译时刻,如果不知道该函数返回值的数据类型和数目,则您不可在
EXECUTE FUNCTION 的 INTO 子句中使用主变量来保存这些值。
反而,
您的程序必须执
行下列任务:
定义动态管理结构来作为用户定义的函数返回的一个值或多个值的定义的存储。
您可使用系统描述符区域,也可使用 sqlda 结构来保存返回的一个值或多个值。

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


系统描述符区域的使用符合 X/Open 标准。

使用 DESCRIBE 语句来检测准备好的 EXECUTE FUNCTION 语句,并描述返回的
一个值或多个值。
指定动态管理结构作为由用户定义的函数返回的数据的位置。
该程序可将返回值从动态管理结构移至主变量内。

重要: 在编译时刻,仅当您不知道用户定义的函数返回的返回值的数目和数据
类型时,才使用动态管理结构。
处理包含用户定义的数据类型的语句
此部分提供如何执行包含带有下列用户定义的数据类型的列的动态 SQL 语句的信息:

Opaque 数据类型:用户可定义的封装了的数据类型
Distinct 数据类型:与其源类型有相同的内部存储表示的数据类型,但有不同的名称
带有 opaque 类型列的 SQL 语句
对于 opaque 类型列的动态执行,请记住下列项:
您必须确保动态管理结构(系统描述符区域或 sqlda 结构)的类型和长度与您插入至
opaque 类型列内的值的数据类型相匹配。
如果该主变量不大得足以保存该数据,
则 GBase 8s ESQL/C 截断 opaque 类型数据为
32 KB。

插入 opaque 类型数据

当 DESCRIBE 语句描述准备好的 INSERT 语句时,
它将动态管理结构的类型和长度
字段设置为该列的数据类型。

下表展示动态管理结构的类型和长度字段。

表 15. 动态管理结构的类型和长度字段
动态管理结构
类型字段
长度字段
系统描述符区域
项描述符的 TYPE 字段
项描述符的 LENGTH 字段
sqlda 结构
sqlvar_struct 结构的
sqltype 字段
sqlvar_struct 结构的 sqllen
字段

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


如果 INSERT 语句包含其数据类型为 opaque 数据类型的列,
则 DESCRIBE 以下列
类型字段值之一来标识此列:
定长 opaque 类型的 SQLUDTFIXED 常量
变长 opaque 类型的 SQLUDTVAR 常量

这些数据类型常量表示采用其内部格式的 opaque 类型。

当您将 opaque 类型数据放置至动态管理结构内时,您必须确保类型字段和长度字段
与您为 INSERT 提供的数据的数据类型相兼容,如下:
如果您提供采用内部格式的 opaque 类型数据,则 DESCRIBE 设置的类型和长度字
段是正确的。
如果您以外部格式(或任何不同于内部格式的格式)提供该数据,则您必须更改类型
和长度字段,DESCRIBE 已将这些字段设置为与该数据的数据类型相兼容的。

该 opaque 类型的输入和输出支持函数不在客户机计算机上。因此,客户机应用程序
不可调用它们来将动态管理结构中的 opaque 类型数据由其外部格式转换为其内部格式。
要以其外部表示提供 opaque 类型数据,请将类型字段值设置为字符数据类型。当数据库
服务器接收字符数据(opaque 类型的外部表示)时,它调用输入支持函数来将 opaque 类
型的外部表示转换为其内部表示。如果该数据是某其他类型,且存在有效的支持或强制转
型函数,则数据库服务器可调用这些函数,而不是转换值。

例如,假设您使用系统描述符区域来保存插入值,且您想要将 opaque 类型数据以其
外部表示发送至数据库服务器。在下列代码段中,SET DESCRIPTOR 语句将 TYPE 字段
重置为 SQLCHAR,以便于 TYPE 字段与它指定给 DATA 字段的主变量(char)的数据
类型相匹配:
EXEC SQL BEGIN DECLARE SECTION;
char extrn_value[100];
int extrn_lngth;
int extrn_type;
EXEC SQL END DECLARE SECTION;


EXEC SQL allocate descriptor 'desc1' with max 100;

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

EXEC SQL prepare ins_stmt from
'insert into tab1 (opaque_col) values(?)';
EXEC SQL describe ins_stmt using sql descriptor 'desc1';

/* At this point the TYPE field of the item descriptor is
* SQLUDTFIXED
*/

stcopy("(1, 2, 3, 4)", extrn_value);
extrn_lngth = stleng(extrn_value);
dtype = SQLCHAR;

/* This SET DESCRIPTOR statement assigns the external
* representation of the data to the item descriptor and
* resets the TYPE field to SQLCHAR.
*/
EXEC SQL set descriptor 'desc1' value 1
data = :extrn_value, type = :extrn_type,
length = :extrn_lngth;
EXEC SQL execute ins_stmt using sql descriptor 'desc1';

opaque 类型数据的截断

如果您指定主变量,
该主变量不够大到保存来自服务器的完全的返回值,
则 GBase 8s
ESQL/C 通常截断该数据以适应主变量,并将实际的长度放置在指示符变量中。

此指示符变量可为您显式地提供的,
或对于动态 SQL,
是动态管理结构的下列字段之
一。
动态管理结构
指示符字段
系统描述符区域
项描述符的 INDICATOR 字段
sqlda 结构

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

sqlvar_struct 结构的 sqlind 字段

然而,这些指示符字段被定义作为 short 整数,因此,存储大小最大仅为 32 KB。

对指示符字段的此大小限制影响 GBase 8s ESQL/C 处理大于 32 KB 的 opaque 类
型数据的截断方式。当 GBase 8s ESQL/C 收到大于 32 KB 的 opaque 类型数据,且该主
变量不够大到足以保存该 opaque 类型数据时,
GBase 8s ESQL/C 将该数据截断为 32 KB。
GBase 8s ESQL/C 在 32 KB 处执行此截断,
即使您编程主变量大于 32 KB
(但仍然不够大
到足以保存该数据)也不行。
带有 distinct 类型列的 SQL 语句
对于 distinct 类型列的动态执行,已经修改了动态管理结构来保存下列关于 distinct
类型的信息:
对于 distinct 类型列的源类型,数据类型常量(来自 sqltypes.h)
distinct 类型列的源类型的扩展的标识符

这些值位于动态管理结构的下列字段中。

动态管理结构
源类型字段
扩展的标识符字段
系统描述符区域
项描述符的
SOURCETYPE 字段
项描述符的 SOURCEID
字段
sqlda 结构
sqlvar_struct 结构的
sqlsourcetype 字段
sqlvar_struct 结构的
sqlsourceid 字段

当 DESCRIBE 语句描述准备好的语句时,它将关于该语句的列的信息存储
在动态管理结构中。在 sqltypes.h 文件中没有特殊的常量来指示 distinct
数据类型。因此,动态管理结构的类型字段不可直接地指示 distinct 类型。
(表 1展示动态管理结构的类型字段。)

反而,动态管理结构中的类型字段有一个特殊的值来指示为 distinct 类型列设置
distinct 位。该类型字段与 distinct 位相组合来指示该 distinct 数据的源类型。 sqltypes.h
头文件提供下列数据类型常量和宏,来为 distinct 列标识 distinct 位。

源类型
Distinct 位常量
Distinct 位宏
LVARCHAR
SQLDLVARCHAR
ISDISTINCTLVARCHAR(type_id)
BOOLEAN
SQLDBOOLEAN
ISDISTINCTBOOLEAN(type_id)

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

源类型
Distinct 位常量
Distinct 位宏
任何其他数据类型
SQLDISTINCT
ISDISTINCTTYPE(type_id)

使用下列算法来确定一列是否为 distinct 类型:
if (one of the distinct bits is set)
{
/* Have a distinct type, now find the
source type */
if (ISDISTINCTLVARCHAR(sqltype))
{
/* Is a distinct of LVARCHAR:
* type field = SQLUDTVAR +
SQLDLVARCHAR
* source-type field = 0
* source-id field = extended identifier
of lvarchar
*/
}
else if
(ISDISTINCTBOOLEAN(sqltype))
{
/* Is a distinct of BOOLEAN
* type field = SQLUDTFIXED +
SQLDBOOLEAN
* source-type field = 0
* source-id field = extended id of
boolean
*/
}
else
{
/* SQLDISTINCT is set */
if (ISUDTTYPE(sqltype))
{
/* Source type is either a built-in simple

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

type or an
* opaque data type
*/
if (source-id field > 0)
/* Is a distinct of an opaque type.
* Pick up the xtended identifier of the
source type
* from the source-id field
*/
else
/* Is a distinct of a built-in simple type.
* Pick up the type id of the source type
from the
* source-type field
*/
}
else
{
/* Source type is a non-simple type, a
complex type.
* Both the source-type and source-id
fields should be 0,
* the source type is embedded in the type
field:
* type = source type +
SQLDISTINCT
*/
}
}
}

下表总结前面算法的伪代码。

源类型
类型字段
源类型字段
扩展的标识符字段

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

源类型
类型字段
源类型字段
扩展的标识符字段
内建的数据类

SQLUDTVAR +
SQLDISTINCT
内建的数据
类型的数据类型
常量
0
LVARCHAR
SQLUDTVAR +
SQLDLVARCHAR
0
LVARCHAR
的扩展标识符
BOOLEAN
SQLUDTFIXED +
SQLDBOOLEAN
0
BOOLEAN
的扩展标识符
任何其他数据
类型
源类型 + SQLDISTINCT
0
0