在 INSERT 中命名程序变量
在 INSERT 中命名程序变量
当您将 INSERT 语句与游标(在 DECLARE 语句中)相关联时,请创建 Insert 游标。在 INSERT 语句中,您可在 VALUES 子句中命名程序变量。当执行每一 PUT 语句时,使用那个时刻的程序变量的内容来填写插入到缓冲区内的行。
如果您正在(随同 INSERT 使用 DECLARE)创建 Insert 游标,则必须在该 VALUES 子句中仅使用程序变量。在准备好的语句的上下文中不识别变量名称;您通过其语句标识符将准备好的语句与游标关联。
下列 GBase 8s ESQL/C 示例展示 Insert 游标的使用。代码包括下列语句:
- DECLARE 语句将名为 ins_curs 的游标与 INSERT 语句相关联,该 INSERT 语句将数据插入到 customer 表内。
- VALUES 子句指定名为 cust_rec 的数据结构;GBase 8s ESQL/C 预处理器将 cust_rec 转化为值的列表,每一结构的组件一个。
- OPEN 语句创建一缓冲区。
- 用户定义的函数(未在此示例内定义)从用户输入获取客户信息并将其保存在 cust_rec 中。
- PUT 语句从 cust_rec 结构的当前内容组成一行,并将其发送到行缓冲区。
- CLOSE 语句将留在行缓冲区中的任何行都插入到 customer 表内,并关闭 Insert 游标:
int keep_going = 1;
EXEC SQL BEGIN DECLARE SECTION
struct cust_row { /* fields of a row of customer table */ } cust_rec;
EXEC SQL END DECLARE SECTION
EXEC SQL declare ins_curs cursor for
insert into customer values (:cust_row);
EXEC SQL open ins_curs;
while ( (sqlca.sqlcode == 0) && (keep_going) )
{
keep_going = get_user_input(cust_rec); /* ask user for new customer */
if (keep_going ) /* user did supply customer info
*/
{
cust_rec.customer_num = 0; /* request new serial value */
EXEC SQL put ins_curs;
}
if (sqlca.sqlcode == 0) /* no error from PUT */
keep_going = (prompt_for_y_or_n("another new customer") =='Y')
}
EXEC SQL close ins_curs;
如果插入的数据可能为 NULL ,则请使用指示符变量。
当准备 INSERT 语句时(请参阅 PREPARE 语句),您不可在它的 VALUES 子句中使用程序变量,但可通过问号(?)占位符表示值。请在 PUT 语句的 FROM 子句中罗列程序变量来提供缺少的值。
下列 GBase 8s ESQL/C 示例罗列在 PUT 语句中的主变量:
char answer [1] = 'y';
EXEC SQL BEGIN DECLARE SECTION;
char ins_comp[80];
char u_company[20];
EXEC SQL END DECLARE SECTION;
main()
{
EXEC SQL connect to 'stores_demo';
EXEC SQL prepare ins_comp from
'insert into customer (customer_num, company) values (0, ?)';
EXEC SQL declare ins_curs cursor for ins_comp;
EXEC SQL open ins_curs;
while (1)
{
printf("\nEnter a customer: ");
gets(u_company);
EXEC SQL put ins_curs from :u_company;
printf("Enter another customer (y/n) ? ");
if (answer = getch() != 'y')
break;
}
EXEC SQL close ins_curs;
EXEC SQL disconnect all;
}
指示符变量是可选的,但如果可能存在包含 NULL 值的 output_var ,则您应使用指示符变量。如果您指定未带 INDICATOR 关键字的指示符变量,则不可在 output_var 与 indicator_var 之间放空格。