返回首页

gbase数据、南大通用产品文档:GBase8s数据库对象名

更新日期:2024年09月11日

使用数据库对象名段来指定数据库对象的名称,例如列、表、视图或用户定义的
例程。当看到引用数据库对象名时,使用本段。
语法
Database Object Name


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1608
元素
描述
限制
语法
database
object 驻留的数据库 必须存在
数据库名
dbservername
database 的数据库服
务器
必须存在。在 @
后面没有空格。
标识符
object
数据库对象的名称
请参阅用法
标识符
用法
数据库对象名可以包含限定符和分隔符以指定数据库、服务器、协同服务器(仅
对于 XPS)、所有者和(对于某些对象)另一个数据库对象(当前数据库对象是
其组成部分)。
GBase 8s 支持使用以冒号(:)—“数据库名:表名”的形式访问指定数据库中的指
定表。
例如,以下表达式指定在数据库服务器 butler 的 stores_demo 数据库中由用户
gbasedbt 拥有的 stock 表的 unit-price 列。
stores_demo@butler:gbasedbt.stock.unit_price
如果创建或重命名一个数据库对象,那么声明的新名称在数据库中相同类型的对
象中必须是唯一的。因而,新视图的名称必须在相同数据库内存在的表、视图和
序列对象的名称和同义词中是唯一的。(但视图可以和相同服务器的不同数据库
中的视图具有相同的名称,或例如和触发器具有相同名称,因为它们是不同类型
的对象。)
在兼容 ANSI 的数据库中,owner.object 组合对于对象类型在数据库中必须是唯
一的。数据库对象规范必须包含不属于您的数据库对象所有者名称。例如,如果
指定了一个不属于您的表,那么也必须指定表的所有者。所有系统目录表的所有
者都是 gbasedbt。
在 GBase 8s 中,唯一性要求不适用于用户定义的例程(UDR)的名称。有关更
多信息,请参阅例程重载以及例程签名。
数据库语言环境代码集中的字符用在数据库对象名中是有效的。有关更多信息,
请参阅 GBase 8s GLS 用户指南。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1609
在外部数据库中指定数据库对象
既可以在本地数据库服务器的外部数据库中,也可以在远程数据库服务器的外部
数据库中指定数据库对象。
在跨数据库查询中指定数据库对象
要在本地数据库服务器的另一个数据库中指定一个对象,必须使用数据库名(如
果外部数据库是符合 ANSI 的,还要加上使用者名称)来限定对象标识符,如此
示例所示:
corp_db:hrdirector.executives
在此示例中,外部数据库的名称是 corp_db。表所有者的名称是 hrdirector。表
的名称为 executives。这里的冒号分隔符( : )要跟在数据库限定符后面。
在 GBase 8s 中,对本地数据库服务器的其它数据库的查询及其其它数据操纵语
言(DML)操纵可以访问在跨数据库事务中的数据类型 中列出的内置不透明数据
类型。DML 操作也可以访问能够强制转型为内置类型的用户定义的数据类型
(UDT)及基于内置类型的 DISTINCT 类型(如果每个 DISTINCT 类型和 UDT
显式地强制转型为内置类型,并且所有的 DISTINCT 类型、UDT 和强制类型转
换在所有参与的数据库中都已定义)。相同的数据类型限制也适用于参量。同时
适用于访问本地 GBase 8s 示例的其它数据库的“用户定义的例程”(UDR)的返
回值(如果该 UDR 定义在所有参与的数据库中)。
在跨服务器查询中指定数据库对象
要在远程数据库服务器的数据库中指定一个对象,必须除数据库对象名以外,还
使用指定数据库、数据库服务器和所有者(如果外部数据库是符合 ANSI 的)的
fully-qualified identifier 。例如,hr_db@remoteoffice:hrmanager.employees 是一
个标准的表名称。
这里,数据库是 hr_db,数据库服务器是 remoteoffice,表所有者是
hrmanager,表名是 employees。在 database 和 database server 限定符之间需要
不带空格的 at ( @ )分隔符。跨服务器查询只能访问不是不透明数据类型的内
置数据类型。在跨服务器操作中不能访问 UDT,也不能访问不透明、复杂或其它
扩展数据类型。(有关 GBase 8s 在跨服务器操作中支持的 DISTINCT 和内置的
OPAQUE 数据类型的列表,请参阅跨服务器事务中的数据类型。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1610
在 GBase 8s 中,如果 UDR 在远程数据库服务器上存在,则必须为 UDR 指定
一个标准标识符。与跨服务器 DML 操作相似,远程 UDR 的参量、参数和返回
值被限制只能针对内置的非不透明数据类型。(有关 GBase 8s 在跨服务器操作
中支持的数据类型的列表,请参阅跨数据库事务中的数据类型。)
只能在下列语句中引用远程数据库。有关这些跨本地服务器的数据库或跨数据库
服务器的语句中的支持的信息,请参阅 GBase 8s SQL 教程指南。

CREATE DATABASE

CREATE SYNONYM

CREATE VIEW

DATABASE

DELETE

EXECUTE FUNCTION

EXECUTE PROCEDURE

INFO

INSERT

LOAD

LOCK TABLE

SELECT

UNLOAD

UNLOCK TABLE

UPDATE
如果数据库服务器的名称是分隔标识符,或者如果它包含大写字母,则该数据库
服务器不能参与分布式 DML 操作。要避免此限制,在声明数据库服务器的名称
或别名时,请仅使用不包含大写字母的未限制名称。
例程重载以及例程签名
因为例程重载,用户定义的例程的名称对于数据库不必唯一。只要每一个 UDR
的 routine signature 是不同的,就可以用同一名称定义多个 UDR 。
UDR 是由它们的特征符唯一标识的。 UDR 的签名包括下列几项信息:

例程类型(函数或过程)

例程的标识符

参数的基数、数据类型和顺序

在兼容 ANSI 的数据库中的所有者名称

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1611
对于任何给定的 UDR,例程签名中至少必须有一项在所有在数据库中注册的
UDR 中是唯一的。
在不兼容 ANSI 的数据库中,除非在 sysdbopen( ) 和 sysdbclose( ) 例程的特殊
情况下,否则具有不同所有者的两个例程不能拥有相同的签名。有关这些会话配
置例程的所有者在定义这些例程的数据库连接或断开连接时影响的信息,请参阅
IFX_REPLACE_MODULE 函数。
指定一个已有的 UDR
当引用现有的 UDR 时,如果所使用的名称不能唯一地标识 UDR ,那么您还必
须在 UDR 名称后面,以 UDR 创建时声明的相同顺序,指定参数数据类型。然
后 GBase 8s 使用例程解析规则来识别 UDR 实例以进行修改、删除或执行。如
果在 UDR 创建是已经为它声明了一个名称,则也可以选择指定它的 specific
name。具体名称描述在专用名这个部分中。有关例程解析的更多信息,请参阅比
较参量和参数列表和 GBase 8s 用户定义的例程和数据类型开发者指南 。
由 UDR 创建的对象的所有者
当在所有者特权的 UDR 的 DDL 已经创建了新数据库对象时,例程所有者(而
不是执行它的用户,如果该用户不是例程的所有者)成为新数据库对象的所有
者。但是,对于 DBA 特权的 UDR ,执行例程的用户(以及必须具有 DBA 特
权的用户)将成为 UDR 创建的任何对象的所有者。

PG_STATIO_ALL_INDEXES 视图将包含当前数据库中的每个索引行,显示特定索引的
I/O 的统计。
名称
类型
描述
relid
oid
索引的表的OID。
indexrelid
oid
该索引的OID。
schemaname
name
该索引的模式名。
relname
name
该索引的表名。
indexrelname
name
索引名称。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
909
名称
类型
描述
idx_blks_read
bigint
从索引中读取的磁盘块数。
idx_blks_hit
bigint
索引命中缓存数。

sqlsignal() 函数启用或禁用 GBase 8s ESQL/C 库处理的信号的信号处理。

语法

void sqlsignal(sigvalue, sigfunc_ptr, mode)

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

mint sigvalue;
void (*sigfunc_ptr) (void);
int mode;
sigvalue
需要捕获的特定的信号的 mint 值(如 signal.h) 定义的那样)。
当前,此参数是未来设计功能的占位符。请将此参数初始化为 -1。

sigfunc_ptr
指向用户定义的函数的指针,其不带参数,来为 sigvalue 信号作为信号句柄调用。
当前,此参数是未来设计功能的占位符。请将此参数初始化为指向不接收参数的函数
的空指针。

mode
可为三种可能的模式之一:
0
初始化信号处理。
1
禁用信号处理。
2
重新启用信号处理。

用法

sqlsignal() 函数当前仅为 SIGCHLD 信号提供处理。在有些情况下,在应用程序结束
之后,defunct 子进程保持。如果应用程序不清理这些进程,则它们导致进程 ID 不必要的
使用,并增加您用尽进程的风险。对于客户机-服务器通讯,当应用程序使用管道时(即,
sqlhosts 文件的 nettype 字段为 ipcpip),此行为才显而易见。对于其他通讯机制,你无
需调用 sqlsignal()(例如, tlipcp 的 nettype)。

sqlsignal() 的 mode 参数确定 sqlsignal() 执行的任务,如下:
设置 mode 为 0 来初始化信号处理。
sqlsignal(-1, (void (*)(void))0, 0);


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

当您以 sqlsignal() 来初始化信号处理时,GBase 8s ESQL/C 库捕获 SIGCHLD 信号
来处理 defunct 子进程的清除。
此初始的 sqlsignal() 调用必须发生在您的应用程序的开头,
在程序中的第一个 SQL 语句之前。如果您省略此初始的调用,则在您的程序中,稍后不
可开启信号处理能力。

启用或禁用信号处理。

如果您想要让 GBase 8s ESQL/C 库为程序的部分执行信息处理,且您自己的代码为
其他部分执行信号处理,则您可采取下列行动:
要禁用信号处理,
请以设置为 1 的 mode 调用 sqlsignal(),
在您想要您的程序处理信
号的点处:
sqlsignal(-1, (void (*)(void))0, 1);
要重新启用信号处理,
请以设置为 2 的 mode 来调用 sqlsignal(),
在您想要 GBase 8s
ESQL 库处理信号的点处:
sqlsignal(-1, (void (*)(void))0, 2);
当您以 sqlsignal() 初始化 SIGCHLD 信号处理时,您允许 GBase 8s ESQL/C 库处理
SIGCHLD 清除。否则,如果 defunct 子进程是个问题,则您的应用程序必须执行对这些
进程的清理。