返回首页

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

更新日期:2024年09月11日

+-------------+---------------------------------+
2 rows in set

当两个值的数据类型之间存在差异时,GBase 8s ESQL/C 将尝试转换其中一种数据类
型。将值从一种数据类型转换为另一种数据类型的过程称为数据转换。
以下列表列出了可能发生数据转换的几种常见情况:
比较
如果您使用比较两种不同类型值的条件,
例如将 zip 代码列的内容与整数值进行比较,
则可能发生数据转换。
例如:为了比较 CHAR 值和数字值,GBase 8s ESQL/C在执行此比较之前将 CHAR
值转换为数字值。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 83 -
抓取和插入
如果您使用不同数据类型的主机变量和数据库列来获取或插入值,则可能会发生数据
转换。
算术运算
如果一种数据类型的数值对不同数据类型的值进行操作,则可能会发生数据转换。
使用主机变量获取和插入
如果您尝试从数据库列中将值从根据表 1中所示的对应关系声明的主机变量中获取,
则 GBase 8s ESQL/C 将尝试转换数据类型。同样,如果您尝试将主机变量的值插入到数据
库列中,如果主机变量和数据库列不使用表 1中的对应关系,则 GBase 8s ESQL/C 可能需
要转换数据类型。GBase 8s ESQL/C 将转换只有转换有意义的数据类型。
转换数字和字符串
在 GBase 8s ESQL/C 将从一种数据类型的值转换为另一种时,它必须确定该转换是
否有意义。
下表显示了数字数据类型和字符数据类型之间可能的转换。在此表中,N 代表具有数
字数据类型(例如 DECIMAL 、FLOAT 或 SMALLINT)的值,C 代表具有字符数据类
型(例如 CHAR 或 VARCHAR)的值。
如果转换不可能,可能因为它无意义或者目标变量太小以致于无法接收转换的值,
GBase 8s ESQL/C 返回下表中结果列返回的值。
表 1. 数据转换的问题和结果
转换
问题
结果
C C
不合适
GBase 8s ESQL/C 截断字符串,设置警告(将
sqlca.sqlwarn.sqlwarn1 设置为 W ,SQLSTATE 设置为
01004),并且将任何指示变量设置为原始字符串的大小。
N C

GBase 8s ESQL/C 为数字值创建字符串;
它使用大或小的
指数格式。
N C
不合适
GBase 8s ESQL/C 用星号填充字符串,设置警告 (将
sqlca.sqlwarn.sqlwarn1 设置为 W ,SQLSTATE 设置为
01004),并将任何指示变量设置为正整数。
当数字的小数部分不适合字符变量时,GBase 8s ESQL/C
舍入数字。仅当整数部分不合适时才会显示星号。
C N

GBase 8s ESQL/C 根据字符值的格式的确定数字数据类

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 84 -
型;如果字符包含小数点,则 GBase 8s ESQL/C 将该值转换
为 DECIMAL 值。
C N
不是数字
数字未定义;GBase 8s ESQL/C 设置 sqlca.sqlcode 和
SQLSTATE 来指示运行时的错误。
C N
溢出
数字未定义;GBase 8s ESQL/C 设置 sqlca.sqlcode 和
SQLSTATE 来指示运行时的错误。
N N
不合适
GBase 8s ESQL/C 尝试将此数字转换为新的数据类型。
N N
溢出
数字未定义;GBase 8s ESQL/C 设置 sqlca.sqlcode 和
SQLSTATE 来指示运行时的错误。
表 1中,不合适自动表示源变量或列的数据的大小或超出了目标变量或列的大小。
将浮点数转换为字符串
GBase 8s ESQL/C 可以自动转换数据库列和字符类型为 char 、
varchar 、
string 或
fixchar 的主机变量之间的浮点列值
(DECIMAL(n) 、
FLOAT 或 SMALLFLOAT 数据类
型)。当 GBase 8s ESQL/C 将浮点值转换为缓冲区不够大以容纳完整精度的字符串时,
GBase 8s ESQL/C 将该值舍入到字符缓冲区中。
将 BOOLEAN 值转换为字符
数据库服务器可以自动转换数据库列和 fixchar 数据类型的主机变量之间的
BOOLEAN 值。
以下列出了 BOOLEAN 值的表示字符:
'\01'
'T'
'\00'
'F'
转换 DATETIME 和 INTERVAL 值
GBase 8s ESQL/C 可以自动转换数据库列和字符类型为 char 、string 或 fixchar
的主机变量之间的 DATETIME 和 INTERVAL 值。GBase 8s ESQL/C 将 DATETIME 或
INTERVAL 值转换为字符字符串并将它存储在主机变量中。
可以使用 GBase 8s ESQL/C 库函数显式转换 DATE 和 DATETIME 值。
在 VARCHAR 和字符数据类型之间进行转换
GBase 8s ESQL/C 可以自动转换数据库列和字符类型为 char 、string 或 fixchar
的主机变量之间的 VARCHAR 值。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 85 -
执行计算操作
当 GBase 8s ESQL/C 在两个值之间执行算术操作时,如果两个值不具有匹配的数据
类型,则它可能需要转换数据类型。
本节提供了用于算术操作的数据转换的以下信息:
GBase 8s ESQL/C 如何转换数字值
GBase 8s ESQL/C 处理调用浮点值的操作
将数字转换为数字
如果两个不同的数值数据类型的值彼此操作,则 GBase 8s ESQL/C 将值转换为下表
所指示的数据类型,然后执行该操作。
表 1. ESQL/C 执行数字操作的数据类型
操作数
D
EC
FLO
AT
INT
SERI
AL
SMALLFL
OAT
SMALLI
NT
DEC
D
EC
DEC
DEC
DEC
DEC
DEC
FLOAT
D
EC
FLO
AT
FLO
AT
FLOA
T
FLOAT
FLOAT
INT
D
EC
FLO
AT
INT
INT
FLOAT
INT
SERIAL
D
EC
FLO
AT
INT
INT
FLOAT
INT
SMALLFL
OAT
D
EC
FLO
AT
FLO
AT
FLOA
T
FLOAT
FLOAT
SMALLIN
T
D
EC
FLO
AT
INT
INT
FLOAT
INT
表 1显示,如果 GBase 8s ESQL/C 在数据类型为 FLOAT 的操作数与数据类型为
DECIMAL
(DEC)
的第二个操作数之间执行操作,
GBase 8s ESQL/C 将生成具有 DECIMAL
数据类型的结果。
调用小数值的操作
下表显示了数值数据类型。数据库列使用 SQL 数据类型,GBase 8s ESQL/C 主机变
量使用对应的 GBase 8s ESQL/C 数据类型。
SQL 数据类型
ESQL/C 数据类型

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 86 -
INTEGER
4 字节整数
SMALLINT
short integer
DECIMAL
十进制
MONEY
十进制
FLOAT
double
SMALLFLOAT
float
当 GBase 8s ESQL/C 对具有数字数据类型的操作执行算术运算,并且其中一个操作
数具有十进制值( SQL 数据类型为 DECIMAL 或 GBase 8s ESQL/C 数据类型为
decimal),GBase 8s ESQL/C 将每个操作数和结果转换为十进制值。
SQL DECIMAL 数据类型具有格式 DECIMAL(p,s),其中 p 和 s 表示以下参数:
p 参数是精度,它是实数中有效数字的总数。
例如:1237.354 的精度为 7。
s 参数是小数位,它是表示实数小数部分的位数。
例如:1237.354 的小数位是 3。如果 DECIMAL 数据类型包含小数位参数
((DECIMAL(p,s)),则它保存定点小数。如果 DECIMAL 数据类型忽略了小数位参数
(DECIMAL(p)),则它保存浮点小数。
GBase 8s ESQL/C decimal 数据类型跟踪 SQL DECIMAL 数据类型的精度和小数位。
为了简单起见,本节使用 SQL DECIMAL 数据类型的格式描述 GBase 8s ESQL/C 如何对
涉及小数的算术运算执行数据转换。但是,相同的数据转换信息适用于涉及 GBase 8s
ESQL/C decimal 主机变量的算术运算。
转换非十进制数值操作
在执行算术运算之前,GBase 8s ESQL/C 将所有尚未 DECIMAL(或 decimal)的操
作数转换为 DECIMAL 。
以下列表显示 GBase 8s ESQL/C 用于非 DECIMAL 操作数的精度和小数位。
操作数类型
转换为
FLOAT
DECIMAL(17)
SMALLFLOAT
DECIMAL(9)

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 87 -
INTEGER
DECIMAL(10,0)
SMALLINT
DECIMAL(5,0)
GBase 8s ESQL/C 不考虑前导或尾随零作为有效数字。前导或尾随零无助于确定精度
和小数位。如果操作时进行加法或减法,则 GBase 8s ESQL/C 会将较少小数位的尾随零添
加到操作数,直至小数位相等。
获得算术结果的 DECIMAL 数据类型
算术结果的精度和小数位取决于操作数的精度和小数位,以及操作数之一是否为浮点
小数,如下所示:
当其中之一的操作数位浮点小数,则算术结果为浮点小数。
例如:对于在定点小数 DECIMAL(8,3) 和 FLOAT 值之间的算术,GBase 8s ESQL/C
将 FLOAT 值转换为浮点小数 DECIMAL(17)。算术结果具有 DECIMAL(17) 数据类型。
当这两个操作数都是定点小数,则算术结果也是定点小数。
下表总结了具有刻度(定点小数)的操作数的算术运算规则。在下表中,p1 和 s1 是
第一个操作数的精度和小数位,p2 和 s2 是第二个操作数的精度和小数位。
表 1. 定点算术结果的精度和小数位
操作
结果的精度和小数位
加法和减法
精度:
小数位:
MIN(32, MAX(p1 - s1, p2 - s2) + MAX(s1, s2) + 1)
MAX(s1, s2)
乘法
精度:
小数位:
MIN(32, p1 + p2)
s1 + s2;
如果 (s1 + s2) > 精度,
则该结果是一个浮点小数
(不
具有小数位)。
除法
精度:
小数位:
32
结果为浮点小数。
和:32 - p1 + s1 - s2 不能为负数。
如果算术操作的结果的数据类型需要有效数字的丢失,则 GBase 8s ESQL/C 将报告
错误。

该函数用于标记某一存储过程为可调试,执行turn_on 后server 端可以执行该存储过程
来进行调试。需要用户根据系统表PG_PROC 手动获取存储过程oid,传入函数中。turn_on
后本session 内执行该存储过程会停在第一条sql 前等待debug 端的调试操作。该设置会在
session 断连后默认被清理掉。目前不支持对启用自治事务的存储过程/函数进行调试。
函数原型为:
DBE_PLDEBUGGER.turn_on(Oid)
RETURN Record;

turn_on 入参和返回值列表
名称
类型
描述

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1109
名称
类型
描述
func_oid
IN oid
函数oid。
nodename
OUT text
节点名称。
port
OUT integer
连接端口号。