GBase 8s
运维管理
文章

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

发表于2025-12-18 09:38:3222次浏览2个评论

下列 GBase 8s ESQL/C 示例说明 WHERE 子句的 CURRENT OF 形式。在此示例中,在收到 10% 折扣的客户的范围内(假设将新列 discount 添加到 customer 表)执行更新。在 WHILE 循环的外部准备 UPDATE 语句来确保仅执行一次解析。

char answer [1] = 'y';

EXEC SQL BEGIN DECLARE SECTION;

   char fname[32],lname[32];

   int low,high;

EXEC SQL END DECLARE SECTION;

main()

{

   EXEC SQL connect to 'stores_demo';

   EXEC SQL prepare sel_stmt from

      'select fname, lname from customer

       where cust_num between ? and ? for update';

EXEC SQL declare x cursor for sel_stmt;

   printf("\nEnter lower limit customer number: ");

   scanf("%d", &low);

   printf("\nEnter upper limit customer number: ");

   scanf("%d", &high);

   EXEC SQL open x using :low, :high;

   EXEC SQL prepare u from

      'update customer set discount = 0.1  where current of x';

   while (1)

      {

      EXEC SQL fetch x into :fname, :lname;

       if ( SQLCODE == SQLNOTFOUND) break;

       }

   printf("\nUpdate %.10s %.10s (y/n)?", fname, lname);

   if (answer = getch() == 'y')

      EXEC SQL execute u;

   EXEC SQL close x;

}

更新 Row 变量(ESQL/C)

带有“集合派生的表”段的 UPDATE 语句允许您在 row 变量中更新字段。“集合派生的表”段标识要在其中更新字段的 row 变量。要获取更多信息,请参阅 集合派生表。

要更新字段

1. 在您的 GBase 8s ESQL/C 程序中创建 row 变量。

2. 可选地,以 SELECT 语句(不带有“集合派生的表”段)将 ROW 类型列选择到 row 变量内。

3. 以 UPDATE 语句和“集合派生的表”段更新 row 变量的字段。

4. 在 row 变量包含正确的字段之后,您使用表或视图名称上的 UPDATE 或 INSERT 语句来将 row 变量保存在 ROW 列(命名的或未命名的)之中。

UPDATE 语句和“集合派生的表”段允许您在 row 变量中更新字段或字段的组。 请在 SET 子句中指定新的字段值。例如,下列 UPDATE 更改 myrect GBase 8s ESQL/C row 变量中的 x 和 y 字段:

EXEC SQL BEGIN DECLARE SECTION;

        row (x int, y int, length float, width float) myrect;

        EXEC SQL END DECLARE SECTION;

        . . .

        EXEC SQL select into :myrect from rectangles where area = 64;

        EXEC SQL update table(:myrect) set x=3, y=4;

假设在 SELECT 语句之后,myrect2 变量有值 x=0、y=0、length=8 以及 width=8。 在 UPDATE 语句之后,myrect2 变量有字段值 x=3、y=4、length=8,以及 width=8。 您不可使用 INSERT 语句的“集合派生的表”段中的 row 变量。

然而,您可使用 UPDATE 语句和“集合派生的表”段来将新字段插入到 row 主变量之内,如果您为该行中的每个字段都指定值的话。

例如,下列代码片段将新的字段值插入到 row 变量 myrect 内,然后将此 row 变量插入到数据库之内:

EXEC SQL update table(:myrect)

                set x=3, y=4, length=12, width=6;

                EXEC SQL insert into rectangles

                values (72, :myrect);

如果该 row 变量是非类型的变量,则您必须在 UPDATE 之前使用 SELECT,以便 GBase 8s ESQL/C 可确定这些字段的数据类型。row 变量中字段的 UPDATE 不可包括 WHERE 子句。

row 变量可存储该行的字段值,但它没有与数据库列内在的连接。一旦 row 变量包含正确的字段值,您必须以下列 SQL 语句之一将该变量保存到 ROW 列内:

评论

登录后才可以发表评论
用户头像
山佳发表于 2个月前
学会了
用户头像
XX发表于 1个月前
感谢分享