返回首页

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

更新日期:2024年09月11日

file_fdw 模块提供了外部数据封装器file_fdw,可以用来在服务器的文件系统中访问数
据文件。数据文件必须是COPY FROM 可读的格式;具体可参照COPY 语句的介绍。访问
这样的数据文件当前只是可读的。当前不支持对该数据文件的写入操作。
当前GBase 8c 会默认编译file_fdw,
在initdb 的时候会在pg_catalog schema 中创建该插

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1142
件。
使用file_fdw 创建的外部表可以有下列选项:
-
**filename**
指定要读取的文件,必需的参数,且必须是一个绝对路径名。
-
**format**
远端server 的文件格式,支持text/csv/binary 三种格式,和COPY 语句的FORMAT
选项相同。
-
**header**
指定的文件是否有标题行,与COPY 语句的HEADER 选项相同。
-
**delimiter**
指定文件的分隔符,与COPY 的DELIMITER 选项相同。
-
**quote**
指定文件的引用字符,与COPY 的QUOTE 选项相同。
-
**escape**
指定文件的转义字符,与COPY 的ESCAPE 选项相同。
-
**null**
指定文件的null 字符串,与COPY 的NULL 选项相同。
-
**encoding**
指定文件的编码,与COPY 的ENCODING 选项相同。
-
**force\_not\_null**
这是一个布尔选项。如果为真,则声明字段的值不应该匹配空字符串(也就是,文
件级别null 选项)。与COPY 的FORCE\_NOT\_NULL 选项里的字段相同。
file_fdw 不支持COPY 的OIDS 和FORCE_QUOTE 选项。
注意这些选项只能为外部表或它的字段声明,
不是在file_fdw 外部数据封装器的选项里,
也不是在使用该封装器的服务器或用户映射的选项里。
修改表级别的选项需要系统管理员权限,
因为安全原因:
只有系统管理员用户能够决定
读哪个文件。
对于一个使用file_fdw 的外部表,EXPLAIN 显示要读取的文件名。除非指定了COSTS
OFF,否则也显示文件大小(字节计)。

GLOBAL_PLANCACHE_STATUS 视图显示GPC 全局计划缓存状态信息。
名称
类型
描述
nodename
text
所属节点名称。
query
text
查询语句text。
refcount
integer
被引用次数。
valid
bool
是否合法。
databaseid
oid
所属数据库id。
schema_name
text
所属schema。
params_num
integer
参数数量。
func_id
oid
该plancache 所在存储过程oid,
如果不属于存储
过程则为0。

deccmp() 函数比较两个 decimal 类型数值。
语法
mint deccmp(n1, n2)
dec_t *n1;
dec_t *n2;
n1
指向要比较的第一个数值的 decimal 结构的指针。
n2
指向要比较的第二个数值的 decimal 结构的指针。

返回代码
-1
第一个值小于第二个值。
0
两个值相同。
1
第一个值大于第二个值。
DECUNKNOWN
有一个值为空。

示例
demo 目录中的文件 deccmp.ec 包含下列样例程序。
/*
* deccmp.ec *
The following program compares DECIMAL numbers and displays the results.

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

#include

EXEC SQL include decimal;
/* leading spaces will be ignored */
char string1[] = "-12345.6789";
char string2[] = "12345.6789";
char string3[] = "-12345.6789";
char string4[] = "-12345.6780";

main()
{
mint x;
dec_t num1, num2, num3, num4;

printf("DECCOPY Sample ESQL Program running.\n\n");

if (x = deccvasc(string1, strlen(string1), &num1))
{
printf("Error %d in converting string1 to DECIMAL\n", x);
exit(1);
}
if (x = deccvasc(string2, strlen(string2), &num2))
{
printf("Error %d in converting string2 to DECIMAL\n", x);
exit(1);
}
if (x = deccvasc(string3, strlen(string3), &num3))
{
printf("Error %d in converting string3 to DECIMAL\n", x);
exit(1);
}

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 624 -
if (x = deccvasc(string4, strlen(string4), &num4))
{
printf("Error %d in converting string4 to DECIMAL\n", x);
exit(1);
}

printf("Number 1 = %s\tNumber 2 = %s\n", string1, string2);
printf("Number 3 = %s\tNumber 4 = %s\n",string3, string4);
printf("\nExecuting: deccmp(&num1, &num2)\n");
printf(" Result = %d\n", deccmp(&num1, &num2));
printf("Executing: deccmp(&num2, &num3)\n");
printf(" Result = %d\n", deccmp(&num2, &num3));
printf("Executing: deccmp(&num1, &num3)\n");
printf(" Result = %d\n", deccmp(&num1, &num3));
printf("Executing: deccmp(&num3, &num4)\n");
printf(" Result = %d\n", deccmp(&num3, &num4));

printf("\nDECCMP Sample Program over.\n\n");
exit(0);
}
输出

DECCMP Sample ESQL Program running.

Number 1 = -12345.6789 Number 2 = 12345.6789
Number 3 = -12345.6789 Number 4 = -12345.6780

Executing: deccmp(&num1, &num2)
Result = -1
Executing: deccmp(&num2, &num3)
Result = 1
Executing: deccmp(&num1, &num3)
Result = 0

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 625 -
Executing: deccmp(&num3, &num4)
Result = -1

DECCMP Sample Program over.