返回首页

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

更新日期:2024年09月11日

语法格式:
UPDATE [database_name.]table_name
SET col_name1=value [, col_name2=value ...]
[WHERE where_definition]
注意:Hive 引擎表开启了属性TBLPROPERTIES(”transactional”=”true”)时方可执行
UPDATE 操作。
注意:对Hive 引擎表执行UPDATE 操作,影响行数均返回0,这是由于HIVE 引
擎本身的限制。

UPDATE 示例,首先创建表并插入数据:
gbase> CREATE TABLE t0(id int) CLUSTERED BY(id) INTO 2 BUCKETS STORED AS ORC
TBLPROPERTIES('transactional' = 'true') ENGINE = 'HIVE';
Query OK, 0 rows affected

gbase>
CREATE
TABLE
t1(id
int,name
varchar(50))
CLUSTERED
BY(name)
INTO
2
BUCKETS
STORED
AS ORC TBLPROPERTIES('transactional' = 'true') ENGINE = 'HIVE';
Query OK, 0 rows affected

gbase> CREATE TABLE t2(id int) ENGINE = 'HIVE';
Query OK, 0 rows affected

gbase> INSERT INTO t0(id) VALUES(1),(2),(3),(4),(5),(6),(2),(3),(1);
Query OK, 9 rows affected
Records: 9 Duplicates: 0 Warnings: 0

gbase> INSERT INTO t1 VALUES(1,'baker'),(2,'hunter'),(3,'carter'),(4,'smith');
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0

gbase> INSERT INTO t2(id) VALUES(1),(2),(4);
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
示例1:更新t1 表的数据。
gbase> SELECT * FROM t1;
+------+--------+
| id | name |
+------+--------+

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 760
| 4 | smith |
| 3 | carter |
| 1 | baker |
| 2 | hunter |
+------+--------+
4 rows in set

gbase> UPDATE t1 SET t1.id = t1.id+1 WHERE t1.id > 1;
Query OK
Rows matched: -1 Changed: -1 Warnings: 0

gbase> SELECT * FROM t1;
+------+--------+
| id | name |
+------+--------+
| 5 | smith |
| 4 | carter |
| 1 | baker |
| 3 | hunter |
+------+--------+
4 rows in set
示例2:使用IN 的多表查询更新。
gbase> SELECT * FROM t1;
+------+--------+
| id | name |
+------+--------+
| 5 | smith |
| 4 | carter |
| 1 | baker |
| 3 | hunter |
+------+--------+
4 rows in set

gbase> UPDATE t1 SET t1.id = 10 WHERE t1.id IN (SELECT t2.id FROM t2);
Query OK
Rows matched: -1 Changed: -1 Warnings: 0

gbase> SELECT * FROM t1;
+------+--------+
| id | name |
+------+--------+
| 5 | smith |
| 10 | carter |

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 761
| 10 | baker |
| 3 | hunter |
+------+--------+
4 rows in set

使用 DESCRIBE 语句可在执行准备好的语句之前获得有关其输出参数和其它功
能的信息。
在 GBase 8s ESQL/C 中使用此语句。(另见 DESCRIBE INPUT 语句。)
语法

元素
描述
限制
语法
descriptor
系统描述符区域
的名称
必须已分配系统描述
符区域
引用字符串
descriptor_var
指定系统描述符
区域的主变量
必须包含分配的系统
描述符区域的名称
特定于语言的名
称规则
sqlda_pointer
指向 sqlda 结

不可以美元符号
($)或冒号(: )
开始。如果使用动态
的 SQL ,则 sqlda
结构是必需的
请参阅 GBase
8s ESQL/C 程序
员手册 中的
sqlda 结构

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 550
statement_id
准备好的 SQL
语句的语句标识

必须在先前的
PREPARE 语句中定义
PREPARE 语句;
标识符
statement
_id_var
包含
statement_id
的值的主变量
必须在先前的
PREPARE 语句中定义
特定于语言的名
称规则
用法
DESCRIBE 可以在运行时提供有关准备好的语句的信息:

准备好的 SQL 语句的类型

是 UPDATE 还是 DELETE 语句包含 WHERE 子句

对于 EXECUTE 、EXECUTE FUNCTION 、EXECUTE
PROCEDURE 、INSERT 、SELECT 或 UPDATE 语句,DESCRIBE 语
句也返回值的数目、数据类型和大小,以及查询返回的列或表达式的名
称。

对于 SELECT 语句,DESCRIBE 还返回查询返回的列或表达式的名称。
使用此信息,您可以编写代码来分配内存,从而控制检索到的值,并且在取得这
些值之后显示或处理它们。
OUTPUT 关键字
OUTPUT 关键字指定只将有关准备好的语句的输出参数的信息存储在 sqlda 描述
符区域中。如果省略这个关键字,DESCRIBE 可以返回输入参数,但这仅针对
INSERT 语句(如果在数据库服务器已初始化的环境中设置了 IFX_UPDDESC
环境变量,这种情况也适用于 UPDATE )。
描述语句类型
DESCRIBE 语句从 PREPARE 语句获取一个语句标识符作为输入。当
DESCRIBE 语句执行时,数据库服务器会设置 sqlca 的 SQLCODE 字段的值,
以指明语句类型(即语句开始处的关键字)。如果准备好的语句文本包含多个
SQL 语句,则 DESCRIBE 语句返回文本中第一个语句的类型。
SQLCODE 设置为 0 表示一个不带 INTO TEMP 子句的 SELECT 语句。这种情
况是最普通的。对于任何其它 SQL 语句,SQLCODE 设置为一个正整数。您可

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 551
以对照定义的常量名测试该数字。在 GBase 8s ESQL/C 中,常量名定义在
sqlstypes.h 头文件中。
DESCRIBE 语句(和 DESCRIBE INPUT 语句)对 SQLCODE 字段的使用不同
于任何其它语句,当它成功执行时可能返回一个非零值。如果愿意,您可以修订
标准的错误检查例程以使用这种行为。
检查 WHERE 子句的存在性
如果 DESCRIBE 语句检测到一个不带 WHERE 子句的 UPDATE 或 DELETE
语句的准备好的语句,则 DESCRIBE 语句将 sqlca.sqlwarn.sqlwarn4 变量设置
为 W。
当 DELETE 或 UPDATE 语句中没有指定 WHERE 子句时,数据库服务器对整
个表执行删除或更新操作。检查 sqlca.sqlwarn.sqlwarn4 变量以避免不期望的对
表所做的全局更改。
描述带运行时参数的语句
如果准备好的语句包含这么一种参数。即在运行时将为该参数提供参数或参数数
据类型的数目,那么您可以描述这些输入值。如果准备好的语句文本包括以下一
个语句,那么 DESCRIBE 语句会返回一个对表中包括的每个列或表达式的描
述:

EXECUTE FUNCTION (或 EXECUTE PROCEDURE)

INSERT

SELECT (不带 INTO TEMP 子句)

UPDATE
在 GBase 8s 中,必须首先按照 GBase 8s SQL 参考指南 中的描述设置
IFX_UPDDESC 环境变量 , 然后才可以使用 DESCRIBE 来获取有关 UPDATE
语句的信息。
描述包括以下信息:

列的数据类型,如表中定义

列的长度,以字节为单位

列或表达式的名称

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 552
对于准备好的 INSERT 或 UPDATE 语句,DESCRIBE 只返回动态参数(那些
由问号(?)表示的参数)。但是,使用 OUTPUT 关键字会防止返回这些参数。
您可以将为返回的信息所设置的目的地指定为一个新的或现有的系统描述符区
域,或是指定为一个指向 sqlda 结构的指针。
系统描述符区域符合 X/Open 标准。
使用 SQL DESCRIPTOR 关键字
使用USING SQL DESCRIPTOR 子句可将对准备好的语句列表的描述存储在先前
分配的系统描述符区域中。
使用 INTO SQL DESCRIPTOR 子句创建新的系统描述符结构并将语句列表的描
述存储在该结构中。
要将一个先前提到的语言描述到一个系统描述符区域,DESCRIBE 会以以下方式更
新系统描述符区域:

将系统描述符区域中的 COUNT 字段设置为语句列表中值的数目。如果
COUNT 大于系统描述符区域中项描述符的数目,则会导致一个错误。

它设置系统描述符区域中的 TYPE 、LENGTH 、NAME 、SCALE 、
PRECISION 和 NULLABLE 字段。

如果列具有不透明数据类型,则数据库服务器会设置项描述符的
EXTYPEID 、EXTYPENAME 、EXTYPELENGTH 、
EXTYPEOWNERLENGTH 和 EXTYPEOWNERNAME 字段。

根据 TYPE 和 LENGTH 信息,为每个项描述符的 DATA 字段分配内
存。
在执行 DESCRIBE 语句之后,SCALE 和 PRECISION 字段分别包含列的小数位
和精度。如果在 SET DESCRIPTOR 语句中设置了 SCALE 和 PRECISION ,并
且将 TYPE 设置为 DECIMAL 或 MONEY,则会修改 LENGTH 字段以调整十
进制值的小数位和精度。如果没有将 TYPE 设置为 ECIMAL 或 MONEY,则不
设置 SCALE 和 PRECISION 的值,并且 LENGTH 不受影响。
您必须使用 SET DESCRIPTOR 语句修改系统描述符区域信息,以显示要接收描
述符的值在内存中的地址。可以将数据类型更改为另一种兼容的类型。此更改会
在取得数据值时引起数据转换的发生。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 553
您可以在支持 USING SQL DESCRIPTOR 子句(如 EXECUTE 、FETCH 、
OPEN 和 PUT)的准备好的语句中使用系统描述符区域。
下面的示例显示了 DESCRIBE 语句中对系统描述符的使用。在第一个示例中,系
统描述符是一个用引号引起的字符串;在第二个示例中,它是一个嵌入的变量名
称。
main()
{
. . .
EXEC SQL allocate descriptor 'desc1' with max 3;
EXEC SQL prepare curs1 FROM 'select * from tab';
EXEC SQL describe curs1 using sql descriptor 'desc1';
}
EXEC SQL describe curs1 using sql descriptor :desc1var;
使用 INTO sqlda Pointer 子句
使用 INTO sqlda_pointer 子句可为 sqlda 结构分配内存,并将它的地址存储在一
个 sqlda 指针中。DESCRIBE 语句用描述信息填充分配的内存。不像 USING 子
句,INTO 子句创建新的 sqlda 结构以存储来自 DESCRIBE 的输出。
DESCRIBE 语句将 sqlda.sqld 字段设置为语句列表中的值的数目。sqlda 结构也
包含一个数据描述符的数组(sqlvar 结构),语句列表中的每个值各有一个相应
的数据描述符。执行 DESCRIBE 语句之后,sqlda.sqlvar 结构便含有 sqltype 、
sqllen 和 sqlname 字段集。
如果列具有不透明数据类型,则 DESCRIBE...INTO 会设置项描述符的 sqlxid 、
sqltypename 、sqltypelen 、sqlownerlen 和 sqlownername 字段。
一旦程序中声明了 sqlda 指针,DESCRIBE 语句就会为该指针分配内存。但是,
应用程序必须指定 sqlda.sqlvar.sqldata 字段的存储区域。
描述集合变量
当使用 USING SQL DESCRIPTOR 或 INTO 子句时,DESCRIBE 语句提供有关
集合变量的信息。在打开 Select 或 Insert 游标之后,必须发出 DESCRIBE 语
句,因为 OPEN...USING 语句指定了要使用的集合变量的名称。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 554
下一个 GBase 8s ESQL/C 代码段动态地选择 :a_set 集合变量的元素进入称为
desc1 的系统描述符区域:
EXEC SQL BEGIN DECLARE SECTION;
client collection a_set;
int i, set_count;
int element_type, element_value;
EXEC SQL END DECLARE SECTION;

EXEC SQL allocate collection :a_set;
EXEC SQL allocate descriptor 'desc1';
EXEC SQL select set_col into :a_set from table1;
EXEC SQL prepare set_id from 'select * from table(?)'

EXEC SQL declare set_curs cursor for set_id;
EXEC SQL open set_curs using :a_set;
EXEC SQL describe set_id using sql descriptor 'desc1';

do
{
EXEC SQL fetch set_curs using sql descriptor 'desc1';
...
EXEC SQL get descriptor 'desc1' :set_count = count;
for (i = 1; i <= set_count; i++)
{
EXEC SQL get descriptor 'desc1' value :i
:element_type = TYPE;
switch
{
case SQLINTEGER:
EXEC SQL get descriptor 'desc1' value :i
:element_value = data;
...
} /* end switch */
} /* end for */
} while (SQLCODE == 0);

EXEC SQL close set_curs;
EXEC SQL free set_curs;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 555
EXEC SQL free set_id;
EXEC SQL deallocate collection :a_set;
EXEC SQL deallocate desc

当您在不符合 ANSI 的数据库中创建表时,所有用户都有访问该表的权限,直到您作为该
表的所有者取消特定用户的表级别权限为止。
下表介绍控制用户可如何访问表的四种权限。

权限
用途
Select 逐表授予权限,并允许您从表选择行。(此权限可限定于表中的特定列。)
Delete 允许您删除行。
Insert 允许您插入行。
Update 允许您更新现有的行(即,更改其内容)。

创建数据库和表的人们经常将 Connect 和 Select 权限授予 public,
以便所有用户都拥有它
们。如果您可查询表,则您至少具有对那个数据库和表的 Connect 和 Select 权限。
您需要其他的表级别权限来修改数据。表的所有者经常保留这些权限,或仅将它们授予特
定的用户。因此,您可能无法修改您可自由地查询的一些表。
例如,由于这些权限都是逐表授予的,因此您仅可拥有对一个表的 Insert 权限,以及仅拥
有对另一表的 Update 权限。甚至可进一步将 Update 权限限定于表中的特定列。
要获取关于这些及其他表级别权限的更多信息,
请参阅
《GBase 8s 数据库设计和实现指南》