南大通用GBase8s 常用SQL语句(176)

在 INSERT 中命名程序变量

在 INSERT 中命名程序变量

当您将 INSERT 语句与游标(在 DECLARE 语句中)相关联时,请创建 Insert 游标。在 INSERT 语句中,您可在 VALUES 子句中命名程序变量。当执行每一 PUT 语句时,使用那个时刻的程序变量的内容来填写插入到缓冲区内的行。

如果您正在(随同 INSERT 使用 DECLARE)创建 Insert 游标,则必须在该 VALUES 子句中仅使用程序变量。在准备好的语句的上下文中不识别变量名称;您通过其语句标识符将准备好的语句与游标关联。

下列 GBase 8s ESQL/C 示例展示 Insert 游标的使用。代码包括下列语句:

  1. DECLARE 语句将名为 ins_curs 的游标与 INSERT 语句相关联,该 INSERT 语句将数据插入到 customer 表内。
  2. VALUES 子句指定名为 cust_rec 的数据结构;GBase 8s ESQL/C 预处理器将 cust_rec 转化为值的列表,每一结构的组件一个。
  3. OPEN 语句创建一缓冲区。
  4. 用户定义的函数(未在此示例内定义)从用户输入获取客户信息并将其保存在 cust_rec 中。
  5. PUT 语句从 cust_rec 结构的当前内容组成一行,并将其发送到行缓冲区。
  6. 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 之间放空格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值