返回首页

gbase数据、南大通用产品文档:GBase8s更新集合元素

更新日期:2024年09月11日

您可通过访问游标内的集合来更新集合元素,就如同您选择或删除个别的元素一样。
如果您想要更新集合 SET{100, 200, 300, 500} 来将值 500 更改为 400,
请从数据库将该 SET
检索至集合变量内,然后声明游标来在 SET 中的元素间移动,如下图所示。
图: 更新集合元素。
DEFINE s SET(INTEGER NOT NULL);
DEFINE n INTEGER;

SELECT numbers INTO s FROM orders
WHERE order_num = 10;

FOREACH cursor1 FOR
SELECT * INTO n FROM TABLE(s)
IF ( n == 500 ) THEN
UPDATE TABLE(s)(x)
SET x = 400 WHERE CURRENT OF cursor1;
EXIT FOREACH;
ELSE
CONTINUE FOREACH;
END IF;
END FOREACH
UPDATE 语句使用集合变量 s 作为集合派生的表。要指定集合派生的表,请使用 TABLE
关键字。
在 UPDATE 语句中跟在 (s) 之后的值 (x) 是您提供的列名称 derived column,
因为
SET 子句需要它,即使集合派生的表没有列也需要。
请将集合派生的表视作有一行,且看起来与下列示例有些相似:
100 200 300 500
在此示例中,x 是包含值 500 的“列”的虚构的列名称。如果您正在更新内建的、opaque、
distinct 或集合类型元素的集合,则仅指定派生的列。如果您正在更新 row 类型的集合,
请使用字段名,而不是派生的列,如 更新 row 类型的集合 描述的那样。

使用变量更新集合
您还可使用存储在变量中的值,而不是文字值,来更新集合。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 309 -
下图中的 SPL 过程使用类似于 图 1 展示的语句,
除了此过程是使用变量,
而不是文字值,
来更新 manager 表的 direct_reports 列中的 SET。图 2 定义该 manager 表。
图: 使用变量更新集合。
CREATE PROCEDURE new_report(mgr VARCHAR(30),
old VARCHAR(30), new VARCHAR(30) )

DEFINE s SET (VARCHAR(30) NOT NULL);
DEFINE n VARCHAR(30);

SELECT direct_reports INTO s FROM manager
WHERE mgr_name = mgr;

FOREACH cursor1 FOR
SELECT * INTO n FROM TABLE(s)
IF ( n == old ) THEN
UPDATE TABLE(s)(x)
SET x = new WHERE CURRENT OF cursor1;
EXIT FOREACH;
ELSE
CONTINUE FOREACH;
END IF;
END FOREACH

UPDATE manager SET mgr_name = s
WHERE mgr_name = mgr;

END PROCEDURE;
嵌套在 FOREACH 循环中的 UPDATE 语句使用集合派生的表 s 和派生的列 x。如果 n 的
当前值与 old 相同,则 UPDATE 语句将它更改为 new 的值。第二个 UPDATE 语句
在 manager 表中存储新集合。

gsql 工具提供了元命令\copy 进行数据导入。
\COPY 命令
\copy 命令格式以及说明参见表9-5 \copy 元命令说明。
表9-5 \copy 元命令说明
语法
说明
\copy { table [ ( column_list ) ] |
( query ) } { from | to } { filename
|
stdin
|
stdout
|
pstdin
|
pstdout }[ with
] [
binary
]
在gsql 客户端登录数据库成功后,可以使用该命令进
行数据的导入/导出操作。
但是与SQL 的COPY 命令不
同,
该命令读取/ 写入的文件是本地文件,
而非数据库
服务器端文件;所以,要操作的文件的可访问性、权

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
315
[ delimiter [ as ] 'character' ]
[ null [ as ] 'string' ] [ csv
[
header
]
[
quote
[
as
]
'character' ]
[ escape
[
as
]
'character'
]
[
force
quote
column_list | * ] [ force not null
column_list ] ]
限等,都是受限于本地用户的权限。
说明:\COPY 只适合小批量、格式良好的数据导入场
景,不会对非法字符做预处理,也无容错能力,无法
适用于含有异常数据的场景。导入数据应优先选择
COPY。
参数说明

table
表的名称(可以有模式修饰)。取值范围:已存在的表名。

column_list
可选的待拷贝字段列表。
取值范围:任意字段。如果没有声明字段列表,将使用所有字段。

query
其结果将被拷贝。
取值范围:一个必须用圆括弧包围的SELECT 或VALUES 命令。

filename
文件的绝对路径。执行copy 命令的用户必须有此路径的写权限。

stdin
声明输入是来自标准输入。

stdout
声明输出打印到标准输出。

pstdin
声明输入是来自gsql 的标准输入。

pstout
声明输出打印到gsql 的标准输出。

binary
使用二进制格式存储和读取,而不是以文本的方式。在二进制模式下,不能声明

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
316
DELIMITER,NULL,CSV 选项。指定binary 类型后,不能再通过option 或copy_option 指
定CSV、FIXED、TEXT 等类型。

delimiter [ as ] 'character'
指定数据文件行数据的字段分隔符。

分隔符不能是\r 和\n。

分隔符不能和null 参数相同,CSV 格式数据的分隔符不能和quote 参数相同。

TEXT 格式数据的分隔符不能包含:\.abcdefghijklmnopqrstuvwxyz0123456789。

数据文件中单行数据长度需<1GB,如果分隔符较长且数据列较多的情况下,会影
响导出有效数据的长度。

分隔符推荐使用多字符和不可见字符。多字符例如'$^&';不可见字符例如0x07,
0x08,0x1b 等。
取值范围:支持多字符分隔符,但分隔符不能超过10 个字节。默认值:

TEXT 格式的默认分隔符是水平制表符(tab)。

CSV 格式的默认分隔符为“,”。

FIXED 格式没有分隔符。

null [ as ] 'string'
用来指定数据文件中空值的表示。取值范围:

null 值不能是\r 和\n,最大为100 个字符。

null 值不能和分隔符、quote 参数相同。默认值:

CSV 格式下默认值是一个没有引号的空字符串。

在TEXT 格式下默认值是\N。

header
指定导出数据文件是否包含标题行,标题行一般用来描述表中每个字段的信息。
header 只能用于CSV,FIXED 格式的文件中。
在导入数据时,如果header 选项为on,则数据文本第一行会被识别为标题行,会忽略
此行。如果header 为off,而数据文件中第一行会被识别为数据。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
317
在导出数据时,如果header 选项为on,则需要指定fileheader。fileheader 是指定导出数
据包含标题行的定义文件。如果header 为off,则导出数据文件不包含标题行。
取值范围:true/on,false/off。默认值:false

quote [ as ] 'character'
CSV 格式文件下的引号字符。默认值:双引号。

quote 参数不能和分隔符、null 参数相同。

quote 参数只能是单字节的字符。

推荐不可见字符作为quote,例如0x07,0x08,0x1b 等。

escape [ as ] 'character'
CSV 格式下,用来指定逃逸字符,逃逸字符只能指定为单字节字符。默认值:双引号。
当与quote 值相同时,会被替换为'\0'。

force quote column_list | *
在CSV COPY TO 模式下,
强制在每个声明的字段周围对所有非NULL 值都使用引号包
围。NULL 输出不会被引号包围。
取值范围:已存在的字段。

force not null column_list
在CSV COPY FROM 模式下,指定的字段输入不能为空。取值范围:已存在的字段。
任务示例
(1)
创建目标表a。
postgres=# CREATE TABLE a(a int);
(2)
导入数据。
1
从stdin 拷贝数据到目标表a。
postgres=# \copy a from stdin;
出现>>符号提示时,输入数据,输入\.时结束
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
318
>> 2
>> \.
查询导入目标表a 的数据。
postgres=# SELECT * FROM a;
a
---
1
2
(2 rows)
2
从本地文件拷贝数据到目标表a。假设存在本地文件/home/gbase/2.csv。

分隔符为‘,’。

在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。
postgres=# \copy a FROM '/home/gbase/2.csv' WITH (delimiter',',IGNORE_EXTRA_DATA
'on');

%
Host CPU iowait time ratio
:
.05
%
MPPDB CPU usage rate:
MPPDB CPU time % in busy time
: