返回首页

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

更新日期:2024年09月11日

存储所有的定义在本数据库的外部表信息。
只显示当前用户有权访问的外部表信息。

视图只有sysadmin 权限可以查看。
名称
类型
描述
foreign_table_catalog
information_schema.sql_id
entifier
外部表所在的数据库名称
(永远是
当前数据库)。
foreign_table_schema
name
外部表的schema 名称。
foreign_table_name
name
外部表的名称。
ftoptions
text[]
外部表的可选项。
foreign_server_catalog
information_schema.sql_id
entifier
外部服务器所在的数据库名称
(永
远是当前数据库)。
foreign_server_name
information_schema.sql_id
entifier
外部服务器的名称。
authorization_identifier
information_schema.sql_id
entifier
所有者的角色名称。

要执行 SQL 语句,数据库服务器必须有下列关于该语句的信息:
语句的类型,诸如 SELECT、DELETE、EXECUTE PROCEDURE 或 GRANT
任何数据库对象的名称,诸如表、列和索引的名称
任何 WHERE 子句条件,诸如列名称和相匹配的标准
将任何返回的值放在哪里,诸如来自 SELECT 语句的选择列表的列值
需要发送至数据库服务器的值,诸如 INSERT 语句的新行的列值

如果 SQL 语句中的信息随着应用程序中的某些条件而不同,则您的 GBase 8s
ESQL/C 程序可使用动态 SQL 来在运行时刻构建该 SQL 语句。
对于动态地执行的 SQL
语句的基本处理,由下列步骤组成:
在字符串变量中组装 SQL 语句的文本。
使用 PREPARE 语句来让数据库服务器检测该语句文本,并为执行准备它。
以 EXECUTE 或 OPEN 语句执行准备好的语句。
释放用于执行准备好的语句的动态资源。
组装和准备 SQL 语句
动态 SQL 允许您在字符串中组装 SQL 语句,作为用户与您的程序的交互。动态
SQL 语句像嵌入至程序内的任何其他 SQL 语句一样,只不过,该语句字符串不可包含任
何主变量的名称。
PREPARE 语句将 SQL 语句字符串的内容发送至数据库服务器,
数据库
服务器解析它并创建语句标识符结构(语句标识符)。
组装语句
请将 SQL 语句的文本指定为单个主变量,其出现在 PREPARE 语句中。动态地执行
SQL 语句的关键在于,将该语句的文本组装至字符串内。您可以下列两种方式组装此语句
字符串:


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

作为固定的字符串,如果您在编译时刻知道所有信息的话
作为字符串操作的序列,如果您在编译时刻没有所有信息的话

如果您知道整个的语句结构,则可在 PREPARE 语句的 FROM 关键字之后罗列它。
括起该语句的引号或双引号是有效的,虽然 ANSI SQL 标准指定引号。例如:
EXEC SQL prepare slct_id from
'select company from customer where customer_num = 101';

提示: 虽然 GBase 8s ESQL/C 不允许在引号括起的字符串内有换行符,但您可在
PREPARE 语句的用引号括起的字符串中包括换行符。如果您指定其为应该的话,随同
PREPARE 语句,将引号括起的字符串传至数据库服务器,则数据库服务器允许引号括起
的字符串中的换行符。因此,您可允许用户从命令行输入前面的 SQL 语句,如下:

select lname from customer
where customer_num = 101

或者,您可将该语句复制至 char 变量内,如下列代码段所示。
stcopy("select company from customer where customer_num = 101", stmt_txt);
EXEC SQL prepare slct_id from :stmt_txt;

这两种方法都有与静态 SQL 语句相同的限制。它们假设您在编译时刻知道整个的语
句结构。与静态语句相比,这些动态形式的缺点在于,直到(通过 PREPARE 语句)运行
时刻,才会发现在该语句中遇到的任何语法错误。如果您静态地执行该语句,则 GBase 8s
ESQL/C 预处理器可在编译时刻发现句法错误
(直到运行时刻,
才可能诊断出语义错误)

当您动态地执行要多次执行的 SQL 语句时,可提升性能。仅解析该语句一次。

在前面的代码段中,
stmt_txt 变量是主变量,
因为它用在嵌入的 SQL 语句
(PREPARE
语句)中。由于主变量不可出现在语句字符串中,因此,还移除了 SELECT 语句的 INTO
子句。反而,请您在 EXECUTE 或 FETCH 语句的 INTO 子句中指定主变量。像
DESCRIBE、EXECUTE 和 FREE 一样的其他 SQL 语句可访问准备好的语句,当它们指
定 slct_id 语句标识符时。

重要:
在缺省情况下,
语句标识符的作用域是全局的。
如果您创建多文件应用程序,
且您想要将语句标识符的作用域限制为单个文件,则以 -local 预处理器选项来预处理该文
件。

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


如果您在编译时刻不知道关于该语句的所有信息,则您可使用下列特性来组装该语句
字符串:
char 主变量可在 SQL 语句(列名称或表名称)中,或在像 WHERE 子句一样的语
句的部分中保存标识符。它们还可包含语句的关键字。
如果您知道语句指定的是什么列值,则可声明主变量来提供在 WHERE 子句中需要
的列值,或来保存由数据库服务器返回的列值。
在 WHERE 子句中的以问号(?)表示的输入参数占位符指示要提供的列值,通常在
执行时刻的主变量中。以这种方式使用的主变量称为输入参数。
您可使用 GBase 8s ESQL/C 字符串库函数,比如 stcopy() 和 stcat()。

下列代码段展示更改了的前面代码段的 SELECT 语句,因此,它使用主变量来动态
地确定客户编号。
stcopy("select company from customer where customer_num = ", stmt_txt);
stcat(cust_num, stmt_txt);
EXEC SQL prepare slct_id from :stmt_txt;

下列代码段展示您可如何使用输入参数来编写与此相同的 SELECT 语句的程序,以
便用户可输入客户编号。
EXEC SQL prepare slct_id from
'select company from customer where customer_num = ?';

您可动态地准备几乎任何 SQL 语句。您不可动态地准备的仅有的语句,是那些直接
地涉及动态 SQL 和游标管理的语句(比如 FETCH 和 OPEN),以及 SQL 连接语句。

提示: 您可使用“延迟了的 PREPARE”特性来延迟执行准备好的 SELECT、INSERT
或 EXECUTE FUNCTION 语句,直到 OPEN 语句为止。
准备有集合变量的语句
请您使用带有 INSERT 或 SELECT 语句的 Collection Derived Table 子
句来访问 GBase 8s ESQL/C集合变量。

当您准备操纵 GBase 8s ESQL/C集合变量的语句时,下列限制适用:
您必须执行该语句文本作为 PREPARE 语句中的以引号括起的字符串。
对于集合变量, GBase 8s ESQL/C 不支持存储在程序变量中的语句文本。

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


语句文本的以引号括起的字符串不可包含任何集合主变量。
要操纵集合变量,
您必须使用问号
(?)
符来指示输入参数,
然后,
当您执行该语句时,
提供集合变量。

如果语句包含集合变量,则您不可执行多语句准备。

例如,下列 GBase 8s ESQL/C 代码段在 a_set 客户机集合变量上准备 INSERT:
EXEC SQL BEGIN DECLARE SECTION;
client collection set(integer not null) a_set;
EXEC SQL END DECLARE SECTION;

EXEC SQL prepare coll_stmt from
'insert into table values (1, 2, 3)';
EXEC SQL execute coll_stmt using :a_set;

重要: 您必须声明一个 GBase 8s ESQL/C 集合变量作为客户机集合变量(存储在客
户机计算机上的集合变量)。
检查准备好的语句
当 PREPARE 将语句字符串发送至数据库服务器时,
数据库服务器解析它来分析它的
错误。数据库服务器在 sqlca 结构中指示该解析的成功,如下:
如果语法是正确的,则数据库服务器设置下列 sqlca 字段:
sqlca.sqlcode 字段(SQLCODE)包含零。
sqlca.sqlerrd[0] 字段包含对受影响的行数的估算,如果被解析的语句为 SELECT、
UPDATE、INSERT 或 DELETE 的话。
sqlca.sqlerrd[3] 字段包含对执行的成本的估算,如果被解析的语句为 SELECT、
UPDATE、INSERT 或 DELETE 的话。此执行成本为加权的磁盘访问的合计,以及处理的
总行数。
如果语句字符串包含语法错误,
或如果在 PREPARE 期间遇到某其他错误,
则数据库
服务器设置下列 sqlca 字段:
将 sqlca.sqlcode 字段(SQLCODE)设置为负的数值(<0)。数据库服务器还将
SQLSTATE 变量设置为错误代码。
sqlca.sqlerrd[4] 字段包含检测到错误的语句文本内的偏移量。

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

执行 SQL 语句
在准备 SQL 语句之后,数据库服务器可执行它。执行准备好的语句的方式依赖于:
该 SQL 语句返回多少行(值的组):
返回一行数据的语句包括单个的 SELECT 和 EXECUTE FUNCTION 语句。
可返回多行数据的语句需要游标来执行;它们包括非单个的 SELECT 和 EXECUTE
FUNCTION 语句。
不返回数据行的所有其他 SQL 语句,包括 EXECUTE PROCEDURE。

该语句是否有输入参数
如果有,必须以 USING 子句执行该语句:
对于 SELECT 和 INSERT 语句,请使用 OPEN...USING 语句。
对于非 SELECT 语句,请使用 EXECUTE...USING 语句。

在编译时刻您是否知道语句列的数据类型:
当您在编译时刻知道该列的数目和数据类型时,您可使用主变量来保存列值。
当您在编译时刻不知道列的数目和数据类型时,您必须使用 DESCRIBE 语句来定义
该列和动态管理结构来保存列值。

下表总结如何执行不同类型的准备好的 SQL 语句。

表 1. 执行不返回行的准备好的 SQL 语句(与游标相关联的 INSERT 除外)
SQL 语句的类型
输入参数
要执行的语句
请参阅
不带有输入参数

EXECUTE
执行非 SELECT 语

当输入参数的数目
和数据类型已知时

EXECUTE...USING
EXECUTE USING 语

当输入参数的数目
和数据类型未知时

EXECUTE...USING
SQL DESCRIPTOR
EXECUTE...USING
DESCRIPTOR

处理参数化的
UPDATE 或 DELETE
语句
处理参数化的
UPDATE 或 DELETE
语句


表 2. 执行与游标相关联的 INSERT 语句

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

SQL 语句的类型
输入参数
要执行的语句
请参阅
不带有输入参数

OPEN
声明选择游标
当输出参数(插入
列)的数目和数据类型已
知时

OPEN...USING
OPEN USING 语句,
处理未知的列列表

当输入参数的数目
和数据类型未知时

OPEN...USING SQL
DESCRIPTOR
OPEN...USING
DESCRIPTOR

处理未知的列列表
处理未知的列列表


表 3. 执行可返回多行的准备好的 SQL 语句:非单个的 SELECT、SPL 函数
SQL 语句的类型
输入参数
要执行的语句
请参阅
不带有输入参数

OPEN
声明选择游标
当选择列表列的数
目和数据类型未知时

OPEN
执行返回多行的
SELECT,
执行返回多行的
SELECT

当返回值的数目和
数据类型未知时

OPEN
执行游标函数,
执行游标函数

当输入参数的数目
和数据类型已知时

OPEN...USING
OPEN USING 语句
当输入参数的数目
和数据类型未知时

OPEN...USING SQL
DESCRIPTOR
OPEN...USING
DESCRIPTOR

执行返回多行的参
数化的 SELECT
执行返回多行的参
数化的 SELECT



表 4. 执行仅返回一行的准备好的 SQL 语句:
单个的 SELECT、
任何外部函数,
或仅返回一组值的 SPL 函

SQL 语句的类型
输入参数
要执行的语句
请参阅
不带有输入参数

EXECUTE...INTO
PREPARE 和
EXECUTE INTO 语句
当返回的值的数目
和数据类型未知时

EXECUTE...INTO
DESCRIPTOR
EXECUTE...INTO SQL
处理未知的选择列

执行非游标函数

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

SQL 语句的类型
输入参数
要执行的语句
请参阅
DESCRIPTOR


处理未知的选择列


执行非游标函数

当输入参数的数目
和数据类型已知时

EXECUTE...INTO ...US
ING
EXECUTE USING 语

当输入参数的数目
和数据类型未知时

EXECUTE...INTO


...USING SQL
DESCRIPTOR


EXECUTE...INTO


...USING
DESCRIPTOR
执行参数化的单个
SELECT 语句
执行参数化的单个
SELECT 语句


释放资源
有时,您可忽略分配给准备好的语句和游标的资源的成本。然而,应用程序可创建的
准备好的对象的数目是有限的。请释放 GBase 8s ESQL/C 用于执行准备好的语句的资源,
如下:
如果该语句与游标相关联,则在访存(或插入)所有行之后,请使用 CLOSE 来关闭
游标。
请使用 FREE 语句来释放为准备好的语句和任何相关联的游标分配的资源。
在您已释
放了准备好的语句之后,您可不再在您的程序中使用它,直到您重新准备或重新声明它为
止。然而,一旦您声明游标,您即可释放相关联的语句标识符,但不影响该游标。

您可使用 AUTOFREE 特性来让数据库服务器为游标及其准备好的语句自动地释放
资源。

如果您的程序在运行时刻使用动态管理结构来描述 SQL 语句,则一旦不再需要该结
构,还请归还此结构的资源。

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

data_part
date_part 函数基于传统Ingres 函数,等效于SQL 标准函数extract。

date_part('field', source)
这里的field 参数必须是一个字符串,而不是一个名称。有效的field 与extract 一样,详
细信息请参见EXTRACT。
示例:
gbase=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
date_part
-----------
16
(1 row)
gbase=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
date_part
-----------
4
(1 row)
表5-7 显示了日期和时间值的规范格式。
表5-7 日期/时间规范格式
类别
模式
描述
小时
HH
一天的小时数,取值范围为01-12
HH12
一天的小时数,取值范围为01-12

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
207
HH24
一天的小时数,取值范围为00-23
分钟
MI
分钟,取值范围为00-59

SS
秒,取值范围为00-59
FF
微秒,取值范围为000000-999999
SSSSS
午夜后的秒,取值范围为0-86399
上、下午
AM 或A.M.
上午标识
PM 或P.M.
下午标识

Y,YYY
带逗号的年(4 位及以上)
SYYYY
公元前四位年
YYYY
年(4 位及以上)
YYY
年的后三位
YY
年的后两位
Y
年的最后一位
IYYY
ISO 年(4 位及以上)
IYY
ISO 年的最后三位
IY
ISO 年的最后两位
I
ISO 年的最后一位
RR
年的后两位
(可在21 世纪存储20 世纪的年
份)
RRRR
可接收2 位或4 位。若是两位,则和RR 的
返回值相同,若是四位,则和YYYY 相同。
BC 或B.C.
AD 或A.D.
纪元标识。BC(公元前)
,AD(公元后)


MONTH
全长大写月份名(空白填充为9 字符)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
208
MON
大写缩写月份名(3 字符)
MM
月份数,取值范围为01-12
RM
罗马数字的月份(I-XII ;I=JAN)
(大写)

DAY
全长大写日期名(空白填充为9 字符)
DY
缩写大写日期名(3 字符)
DDD
一年里的日,取值范围为001-366
DD
一个月里的日,取值范围为01-31
D
一周里的日,取值范围为1-7(从周日开始
计算,1 表示周日)

W
一个月里的周数,取值范围为1-5(第一周
从该月第一天开始)
WW
一年里的周数,取值范围为1-53。
(第一周
从该年的第一天开始)
IW
ISO 一年里的周数(第一个星期四在第一周
里)
世纪
CC
世纪(2 位)
(21 世纪从2001-01-01 开始)
儒略日
J
儒略日(自公元前4712 年1 月1 日来的天
数)
季度
Q
季度
上表中RR 计算年的规则如下:

输入的两位年份在00~49 之间:
当前年份的后两位在00~49 之间,返回值年份的前两位和当前年份的前两位相同;当
前年份的后两位在50~99 之间,返回值年份的前两位是当前年份的前两位加1。

输入的两位年份在50~99 之间:

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
209
当前年份的后两位在00~49 之间,返回值年份的前两位是当前年份的前两位减1;当
前年份的后两位在50~99 之间,返回值年份的前两位和当前年份的前两位相同。