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

使用 INTO 子句

如果您将 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句与函数游标相关联,则该语句可包含 INTO 子句来指定变量来接收返回的值。仅当写 SELECT、EXECUTE FUNCTION 或 EXECUTE PROCEDURE 语句作为游标声明的一部分时,才可使用这种方法;请参阅 DECLARE 语句。在这种情况下,FETCH 语句不可包含 INTO 子句。

下列示例使用 SELECT 语句的 INTO 子句来指定 GBase 8s ESQL/C 中的程序变量:

EXEC SQL declare ord_date cursor for

   select order_num, order_date, po_num

      into :o_num, :o_date, :o_po;

EXEC SQL open ord_date;

EXEC SQL fetch next ord_date;

如果您准备 SELECT 语句,则 SELECT 不可包括 INTO 子句,因此必须使用 FETCH 语句的 INTO 子句。

在您动态地创建 SELECT 语句时,不可使用 INTO 子句,因为您不可在准备好的语句中命名主变量。

如果您确定投影列表中值的数量和数据类型,则可使用 FETCH 语句中的 INTO 子句。然而,如果用户输入生成了查询,则可能无法确定被选择的值的数量和数据类型。在这种情况下,您必须或者使用系统描述符,或者使用指向 sqlda 结构的指针。

使用指示符变量

如果返回的数据可能为空,则请使用指示符变量。

indicator_var 参数是可选的,但如果可能存在 output_var 的值为 NULL 的情况,则使用指示符变量。

如果您指定不带 INDICATOR 关键字的指示符变量,则不可在 output_var 与 indicator_var 之间加空格。

要获取更多关于在 indicator_var 之前加前缀的规则的信息,请参阅 GBase 8s ESQL/C 程序员手册

主变量不可为 DATETIME 或 INTERVAL 数据类型。

在需要 FETCH 的 INTO 子句时

在 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)省略 INTO 子句时,在访存行时必须指定数据目标。

例如,要动态地执行 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句,SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)不可在 PREPARE 语句中包括其 INTO 子句。因此,FETCH 语句必须包括 INTO 子句来将数据检索到一组变量内。这种方法让您在不同的内存位置中存储不同的行。

仅可使用 FETCH 语句中的 INTO 子句来访存到程序数组元素内。如果您使用程序数组,则必须罗列数据名称和在 data_structure 中数据的特定元素。在您声明游标时,请不要在 SQL 语句内引用数据元素。

提示: 如果您确定在 Projection 子句的选择列表中值的数量和数据类型,则可使用 FETCH 语句中的 INTO 子句。

在下列 GBase 8s ESQL/C 示例中,一系列完整的行被访存到程序数组内。每一 FETCH 语句的 INTO 子句指定数组元素和数据名称:

EXEC SQL BEGIN DECLARE SECTION;

   char wanted_state[2];

   short int row_count = 0;

   struct customer_t{

   {

      int    c_no;

      char   fname[15];

      char   lname[15];

   } cust_rec[100];

EXEC SQL END DECLARE SECTION;

main()

{

   EXEC SQL connect to'stores_demo';

   printf("Enter 2-letter state code: ");

   scanf ("%s", wanted_state);

   EXEC SQL declare cust cursor for

      select * from customer where state = :wanted_state;

   EXEC SQL open cust;

   EXEC SQL fetch cust into :cust_rec[row_count];

   while (SQLCODE == 0)

   {

      printf("\n%s %s", cust_rec[row_count].fname,

         cust_rec[row_count].lname);

      row_count++;

      EXEC SQL fetch cust into :cust_rec[row_count];

   }

   printf ("\n");

   EXEC SQL close cust;

   EXEC SQL free cust;

}

使用系统描述符区域(X/Open)

当您不知道在运行时 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句返回的返回值的数量或其数据类型时,可使用系统描述符区域来存储输出值。系统描述符区域描述一个或多个返回值的数据类型和内存位置,并符合 X/Open 标准。

关键字 USING SQL DESCRIPTOR 将系统描述符区域的名称引入您访存行的内容或用户定义的函数的返回值内。然后您可使用 GET DESCRIPTOR 语句来将 FETCH 语句返回的值从系统描述符区域传送到主变量内。

下列示例展示有效的 FETCH…USING SQL DESCRIPTOR 语句:

EXEC SQL allocate descriptor 'desc';

   ...

EXEC SQL declare selcurs cursor for

   select * from customer where state = 'CA';

EXEC SQL describe selcurs using sql descriptor 'desc';

EXEC SQL open selcurs;

while (1)

   {

   EXEC SQL fetch selcurs using sql descriptor 'desc';

您还可使用 sqlda 结构来动态地提供参数。

使用 sqlda 结构

在您不知道 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句返回的值的数量或其数据类型时,可使用指向 sqlda 结构的指针来存储输出值。

此结构包含为一个选择的值指定数据类型和内存位置的数据描述符。关键字 USING DESCRIPTOR 引入指向 sqlda 结构的指针。

提示: 如果您知道在选择列表中所有值的数量和数据类型,则可使用 FETCH 语句中的 INTO 子句。要获取更多信息,请参阅 在需要 FETCH 的 INTO 子句时。

要指定 sqlda 结构作为参数位置:

  1. 声明 sqlda 指针变量。
  2. 使用 DESCRIBE 语句来填充 sqlda 结构。
  3. 分配内存来保留数据值。
  4. 使用 FETCH 的 USING DESCRIPTOR 子句来指定 sqlda 结构作为您访存返回值的目标位置。

下列示例展示 FETCH USING DESCRIPTOR 语句:

struct sqlda *sqlda_ptr;

...

EXEC SQL declare selcurs2 cursor for

   select * from customer where state = 'CA';

EXEC SQL describe selcurs2 into sqlda_ptr;

...

EXEC SQL open selcurs2;

while (1)

   {

   EXEC SQL fetch selcurs2 using descriptor sqlda_ptr;

   ...

sqld 值指定 sqlda 结构的 sqlvar 结构的出现个数中描述的输出值的数量。此数量必须对应于从准备好的语句返回的值的数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值