返回首页

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

更新日期:2024年09月11日


GBase UP 产品手册 4 管理员指南

文档版本04(2021-04-21) 南大通用数据技术股份有限公司 174
------------------------------------------------------------------------------------
| 192.168.153.134 | 10 | 192.168.153.130 |

使用 EXECUTE 语句来运行一个先前准备好的语句或一个准备好的多语句对象。
请随同 GBase 8s ESQL/C 使用本语句。
语法

元素
描述
限制
语法
stmt_id
准备好的 SQL
语句的标识符
必须在先前 PREPARE 语句中已
经声明
标识符
stmt_id_var
包含准备好的语
句标识符的主变

必须存在,且必须包含一个先前
PREPARE 语句已声明的语句标识
符,并必须为字符数据类型
PREPARE
语句
用法
EXECUTE 语句向数据库服务器传递一个准备好的 SQL 语句来执行。下列示例
展示 GBase 8s ESQL/C 程序内的 EXECUTE 语句:
EXEC SQL PREPARE del_1 FROM
'DELETE FROM customer WHERE customer_num = 119';
EXEC SQL EXECUTE del_1;
一旦准备好,SQL 语句可根据需要执行。
在(使用 FREE 语句)释放数据库服务器资源之后,您不可随同 DECLEAR 游
标或随同 EXECUTE 语句来使用该语句标识符,直到再次准备该语句。
如果该语句包含问号(?)占位符,则请在执行之前使用 USING 子句来为它们提
供指定的值。要获取更多信息,请参阅 USING 子句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 597
您可执行任意准备好的语句,除了下列列表中的那些:

返回超过一行的准备好的 SELECT 语句
当您使用准备好的 SELECT 语句来返回多行数据时,必须使用游标来检
索这些数据行。作为替代方法,您可 EXECUTE 准备好的 SELECT
INTO TEMP 语句来取得相同的结果。
要获取更多关于游标的信息,请参阅 DECLARE 语句。

返回多于一行的 SPL 函数的准备好的 EXECUTE FUNCTION(或
EXECUTE PROCEDURE)语句
当您准备 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句来
调用返回多行的 SPL 函数时,必须使用游标来检索这些数据行。
要获取更多关于如何执行 SELECT 或 EXECUTE FUNCTION(或
EXECUTE PROCEDURE)语句的信息,请参阅 PREPARE 语句。
在准备触发 INSERT、DELETE 或 UPDATE 之后,如果您创建或删除触发器,
则当您执行准备好的语句时,该语句返回错误。
语句标识符的作用域
程序可由一个或多个源代码文件组成。缺省情况下,语句标识符引用的作用域对
于程序是全局的。在一个文件中创建的语句标识符可从另一个文件引用。
在多文件程序中,如果您想要将语句标识符的引用作用域限定到所执行的文件,
则可以 -local 命令行选项预处理所有文件。
INTO 子句
使用 INTO 子句来保存这些 SQL 语句的返回值:

准备好的单 SELECT 语句,该语句仅返回选择列表中那些列的一行列值

SPL 函数的准备好的 EXECUTE FUNCTION(或 EXECUTE
PROCEDURE)语句,该语句仅返回一组值
EXECUTE 语句的 INTO 子句有下列语法:
INTO 子句

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 598

元素
描述
限制
语法
descriptor
标识系统描述符区域的
带引号字符串
必须已分配。使用
单(' )引号
引用字符

descriptor_var
标识系统描述符区域的
主变量
必须已分配系统描
述符区域
特定于语

indicator_var
主变量,如果相应的
parameter_var 为
NULL 值,或发生截断,
则该变量收到返回码
不可为 DATETIME
或 INTERVAL 数据
类型
特定于语

output_var
主变量,其内容替代准
备好的语句中的问号
(?)占位符
必须为字符数据类

特定于语

sqlda_pointer
指向 sqlda 结构的指
针,定义值的数据类型
和内存位置,来替换准
备好的对象中的问号
(?)占位符
不可以美元符号
($)或冒号( :)
开头。动态的 SQL
需要 sqlda 结构
DESCRIBE
INPUT 语

这非常类似于 USING 子句 的语法。
INTO 子句为更复杂和更长的语法提供简明有效的替代方法。此外,通过将值放
入可显示的变量之内,INTO 子句简化和增强检索和显示数据值的能力。例如,
如果您使用 INTO 子句,则无需使用游标来从表中检索值。
您可将返回的值存储在输出变量中,或存储在输出 sqlda 指针中。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 599
对 INTO 子句的限制
如果您执行返回多于一行的准备好的 SELECT 语句,或执行返回多于一组返回值
的 SPL 函数的准备好的 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)
语句,则会收到错误消息。此外,如果您准备和声明一个语句然后尝试执行那个
语句,则会收到错误消息。
您不可从表列中选择 NULL 值并将那个值放入输出变量内。如果您事先知道表列
包含 NULL 值,则在选择该数据之后,检查与该列相关联的指示符变量来确定该
值是否为 NULL。
要随同 EXECUTE 语句使用 INTO 子句:
1. 声明 EXECUTE 语句使用的输出变量。
2. 使用 PREPARE 来准备 SELECT 语句或来准备 EXECUTE FUNCTION
(或 EXECUTE PROCEDURE)语句。
3. 使用 EXECUTE 语句,随同 INTO 子句,来执行 SELECT 语句或来执
行 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句。
以参数替代占位符
在您执行准备好的语句之前,您可执行下列任一项来替代语句中的问号占位符:

主变量名称(如果在编译时知道参数的数量和数据类型)

标识系统描述符区域的系统描述符

作为指向 sqlda 结构指针的描述符
后面的章节描述这些指定参数的每一选项。
保存主变量或程序变量中的值
如果您知道在运行时提供的返回值的数量及其数据类型,则可在程序中将
SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句返回的
值定义为主变量。随同 INTO 关键字使用这些主变量,后跟变量的名称。这些变
量与返回值相匹配,从左至右一一对应。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 600
你必须为 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)返
回的每一个值提供一个变量名称。每一变量的数据类型必须与来自准备好的语句
的相应返回值兼容。
将值保存在系统描述符区域中
如果您在运行时不知道要提供的返回值的数量或其数据类型,则可将输出值与系
统描述符区域相关联。系统描述符区域描述一个或多个值的数据类型和内存位
置。
系统描述符区域符合 X/Open 标准。
要指定系统描述符区域为输出值的位置,请使用 EXECUTE 语句的 INTO SQL
DESCRIPTOR 子句。每次运行 EXECUTE 语句时,系统描述符区域所描述的值
都存储在系统描述符区域中。
下列示例展示如何使用系统描述符区域来执行 GBase 8s ESQL/C 中的准备好的语
句:
EXEC SQL allocate descriptor 'desc1';
...
sprintf(sel_stmt, "%s %s %s",
"select fname, lname from customer",
"where customer_num =",
cust_num);
EXEC SQL prepare sel1 from :sel_stmt;
EXEC SQL execute sel1 into sql descriptor 'desc1';
COUNT 字段对应于准备好的语句返回的值的数量。COUNT 的值必须小于或等
于当以 ALLOCATE DESCRIPTOR 语句分配系统描述符区域时所指定的发生次数
的值。
你可以 GET DESCRIPTOR 语句获取域的值,并以 SET DESCRIPTOR 语句设置
该值。
要获取更多信息,请参阅 GBase 8s ESQL/C 程序员手册 中关于系统描述符区域
的讨论。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 601
在 sqlda 结构(ESQL/C)中保存值
如果在运行时您不知道返回的输出值的数量或其数据类型,则可从 sqlda 结构关
联输出值。sqlda 结构罗列一个或多个返回值的数据类型和内存位置。要指定
sqlda 结构作为返回值的位置,请使用 EXECUTE 语句的 INTO DESCRIPTOR
子句。每次 EXECUTE 语句运行时,数据库服务器将 sqlda 结构描述的返回值
放在该 sqlda 结构内。
下一个示例使用 sqlda 结构来执行准备好的语句:
struct sqlda *pointer2;
...
sprintf(sel_stmt, "%s %s %s",
"select fname, lname from customer",
"where customer_num =",
cust_num);
EXEC SQL prepare sel1 from :sel_stmt;
EXEC SQL describe sel1 into pointer2;
EXEC SQL execute sel1 into descriptor pointer2;
sqlda.sqld 值指定 sqlvar 发生次数所描述的输出值的数量。这个数量必须对应于
SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句返回的
值的数量。
要获取更多信息,请参阅 GBase 8s ESQL/C 程序员手册 中关于 sqlda 的讨论。
这个示例在 GBase 8s ESQL/C 中随同 EXECUTE 语句使用 INTO 子句:
EXEC SQL prepare sel1 from 'select fname, lname from customer
where customer_num =123';
EXEC SQL execute sel1 into :fname, :lname using :cust_num;
下一示例使用 INTO 子句来返回多行数据:
EXEC SQL BEGIN DECLARE SECTION;
int customer_num =100;
char fname[25];
EXEC SQL END DECLARE SECTION;

EXEC SQL prepare sel1 from 'select fname from customer
where customer_num=?';
for ( ;customer_num < 200; customer_num++)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 602
{
EXEC SQL execute sel1 into :fname using customer_num;
printf("Customer number is %d\n", customer_num);
printf("Customer first name is %s\n\n", fname);
}
sqlca 记录和 EXECUTE
在 EXECUTE 语句之后,sqlca 可反映两种结果:

sqlca 可反映 EXECUTE 语句内的错误。
例如,当在准备好的语句中的 UPDATE …WHERE 语句处理零行时,数
据库服务器设置 sqlca 为 100。

sqlca 可反映所执行语句的成功或失败。
以 EXECUTE 返回的 SQLCODE 值
如果准备好的语句在执行时未能访问任何行,则数据库服务器返回 SQLCODE
零 (0) 值。
然而,对于多语句的准备好的对象,如果下列列表中的任何语句都未能访问行,
则返回的 SQLCODE 值为 SQLNOTFOUND ( = 100):

INSERT INTO table SELECT … WHERE

SELECT…WHERE … INTO TEMP

DELETE … WHERE

UPDATE … WHERE
在符合 ANSI 的数据库中,如果您准备并执行上述列表中任何语句,且未返回
行,则返回的 SQLCODE 值为 SQLNOTFOUND ( = 100)。
USING 子句
使用 USING 子句来指定要替代准备好的语句中的问号(?)占位符的值。在
EXECUTE 语句中提供在准备好的语句中替代问号(?)占位符的值,此操作有时
称为 参数化 准备好的语句。
USING 子句

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 603

元素
描述
限制
语法
descriptor
标识系统描述符区域的带
引号字符串
必须已经分配了
系统描述符区
域。使用单
( ' )引号。
引用字符

descriptor_var
标识系统描述符区域的主
变量
必须已经分配了
系统描述符区域
特定于语

indicator_var
如果相应的
parameter_var 为 NULL
值,或如果发生截断,则
收到返回码的主变量
不可为 DATETIME
或 INTERVAL 数
据类型
特定于语

parameter_var
主变量,其内容替代准备
好的语句中的问号(?)
占位符
必须为字符数据
类型
特定于语

sqlda_pointer
指向 sqlda 结构的指
针,定义值的数据类型和
内存位置,来替代准备好
的对象中的问号(?)占
位符
不可以美元符号
($)或冒号
( :)开头。动
态的 SQL 需要
sqlda 结构
DESCRIBE
INPUT 语

这非常类似于 INTO 子句 的语法。
如果在运行时您直到要提供的参数的数量或其数据类型,则可在程序中将
EXECUTE 语句所需要的参数定义为主变量。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 604
如果在运行时您不知道要提供的参数的数量,则可关联来自系统描述符区域或
sqlda 结构的输入值。这两种描述符结构都描述用以替代问号(?)占位符的一个
或多个值的数据类型和内存位置。
通过主变量或程序变量提供参数
通过以后跟变量名称的 USING 关键字打开游标来向数据库服务器传递参数。这
些变量与准备好的语句问号(?)占位符相匹配,从左至右一一对应。 您必须为
每一占位符提供一个存储参数变量。每一变量的数据类型必须与准备好的语句所
需要的相应值兼容。
下列示例执行在 GBase 8s ESQL/C 中准备好的 UPDATE 语句:
stcopy ("update orders set order_date = ?
where po_num = ?", stm1);
EXEC SQL prepare statement_1 from :stm1;
EXEC SQL execute statement_1 using :order_date, :po_num;
通过系统描述符提供参数
您可创建描述一个或多个值的数据类型和内存位置的系统描述符区域,然后在
EXECUTE 语句的 USING SQL DESCRIPTOR 子句中指定该描述符 。
每次运行 EXECUTE 语句时,使用系统描述符区域描述的值来替代 PREPARE
语句中的问号(?)占位符。
COUNT 字段对应于准备好的语句中动态参数的数量。COUNT 的值必须小于或
等于项描述符的数量,这个数量时当以 ALLOCATE DESCRIPTOR 语句分配系统
描述符区域时指定的。
下列示例展示如何使用系统描述符来执行 GBase 8s ESQL/C 中准备好的语句:
EXEC SQL execute prep_stmt using sql descriptor 'desc1';
通过 sqlda 结构(ESQL/C)提供参数
您可在 EXECUTE 语句的 USING DESCRIPTOR 子句中指定 sqlda 指针。
每次运行 EXECUTE 语句时,使用描述符结构描述的值来替代 PREPARE 语句
中的问号(?)占位符。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 605
sqlda.sqld 值指定 sqlvar 的发生次数中描述的输入值数量。该数量必须对应于准
备好的语句中动态参数的数量。
下列示例显示如何使用 sqlda 结构来执行 GBase 8s ESQL/C 中准备好的语句:
EXEC SQL execute prep_stmt using descriptor pointer2;

db2 数据库系统中创建如下表及数据:
CREATE DATABASE test
connect to test
drop table t
CREATE TABLE t (a int,b decimal(15,2), c varchar(20),d real,e date)
INSERT INTO t VALUES (-3,0.93,'helloworld',569.9,'2013-03-19')
INSERT INTO t VALUES (-3,0.93,'helloworld',569.9,'2013-03-19')
INSERT INTO t VALUES (19,-15.69,'ff',157,'1999-11-16')
INSERT INTO t VALUES (20,16,'he\n%\n\t\t$\n',52,'1982-06-03')
INSERT INTO t VALUES (20,16,'\n\nhe\t%$\t',23,'1982-06-03')
INSERT INTO t VALUES (58,12.30,'xyz
abc',13.69,'1978-12-20')
INSERT INTO t VALUES (991,-0,'北京',1.230000E+01,'1989-06-07')