在事务内部打开 Update 游标

如果您正在带有显式事务的数据库中工作,则必须在事务内打开更新游标。如果您使用 WITH HOLD 选项声明了该游标,则放弃此要求。

打开 Function 游标

当您打开 Function 游标时,随同在 USING 子句中指定的任何值,将 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句传递到数据库服务器。

将 USING 子句中的值作为参数传递给用户定义的函数。必须声明此用户定义的函数来接受值。(如果先前准备了该语句,则在准备的时候将该语句传递给数据库服务器。)数据库服务器执行该函数来指出它返回第一个值集的位置。

下列示例展示 GBase 8s ESQL/C 中的一个简单的 OPEN 语句:

EXEC SQL declare s_curs cursor for

execute function new_func(arg1,arg2)

into :ret_val1, :ret_val2;

EXEC SQL open s_curs;

重新打开 Select 或 Function 游标

仅当数据库服务器打开 Select 游标或 Function 游标时,它才计算在 OPEN 语句的 USING 子句中指定的值。在打开游标时,在 USING 子句中对程序变量的后续更改不更改游标的活动集合。

在符合 ANSI 的数据库中,如果您试图打开一已打开的游标,则会收到错误代码。

在不符合 ANSI 的数据库中,后续的 OPEN 语句关闭该游标,然后重新打开它。当数据库服务器重新打开游标时,它基于 USING 子句中变量的当前值创建新的活动集合。如果自从先前的 OPEN 语句以来这些变量已经更改,则重新打开该游标可生成一完全不同的活动集合。

即使这些变量的值未改变,在下列情况下,该活动集合中的值也可不同:

  1. 如果用户定义的函数采用了与在 Function 游标上的先前的 OPEN 语句不同的执行路径
  2. 自从 Select 游标上的先前的 OPEN 语句以来,如果表中的数据更改了

当数据库服务器打开 Select 或 Function 游标时,它可动态地处理大多数查询,无需预先取回所有行。因此,如果其他用户在同一时间正在修改该用表正在处理的表,则活动集合可能反映这些活动的结果。

对于一些查询,当数据库服务器打开该游标时,它计算整个活动集合。这些查询包括具有下列特性的那些:

  1. 要求排序的查询:那些带有 ORDER BY 子句或带有 DISTINCT 或 UNIQUE 关键字的
  2. 要求散列的查询:那些带有结合或带有 GROUP BY 子句的

对于这些查询,在游标正在处理时其他用户对该表的任何更改都不反映在活动集合中。

与 Select 和 Function 游标相关的错误

由于数据库服务器首次看到该查询,它可能检测错误。在这种情况下,它不实际地返回数据的第一行,但它重置 SQLCODE 变量和 sqlca 的 sqlca.sqlcode 字段。该值或为负数或为零,如下表所示。

代码值     含义

负数       在 SELECT 语句中检测到错误

零         SELECT 语句有效

与 ESQL/C 例程不同,SPL 例程没有对 sqlca 结构的直接访问。ESQL/C 例程必须显式地调用内建的 SQLCODE 函数来访问与 OPEN 引用的游标相关联的 SELECT、EXECUTE FUNCTION 或 EXECUTE PROCEDURE 语句的返回代码。

如果 SELECT、SELECT…FOR UPDATE、EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句有效,但没有与其条件相匹配的行,则第一个 FETCH 返回值 100(SQLNOTFOUND),表示未找到行。

提示: 当您遇到 SQLCODE 错误时,还存在相应的 SQLSTATE 错误值。要了解关于如何查看消息文本的信息,请参考 使用 SQLSTATE 错误状态代码。

打开 Insert 游标(ESQL/C)

当您打开 Insert 游标时,该游标将 INSERT 语句传递给数据库服务器,数据库服务器检查关键字和列名称的有效性。数据库服务器还为插入缓冲区分配内存来保留新数据。(请参阅 DECLARE 语句。)

对与 INSERT 语句相关联的游标的 OPEN 语句包括 USING 子句。

打开 Insert 游标的示例

下列 GBase 8s ESQL/C 示例展示带有 Insert 游标的 OPEN 语句:

EXEC SQL prepare s1 from

'insert into manufact values ('npr', 'napier')';

EXEC SQL declare in_curs cursor for s1;

EXEC SQL open in_curs;

EXEC SQL put in_curs;

EXEC SQL close in_curs;

重新打开 Insert 游标

当您重新打开已打开的 Insert 游标时,会有效地刷新插入缓冲区;存储在插入缓冲区中的任何行都会写到数据库表内。数据库服务器首先关闭导致刷新的游标,然后重新打开该游标。要获取关于如何检查错误和对插入的行计数的信息,请参阅 错误检查。

在符合 ANSI 的数据库中,如果您试图打开一已打开的游标,则会收到错误代码。

打开 Collection 游标(ESQL/C)

您可声明集合变量上的 Select 和 Insert 游标。这些游标称为 Collection 游标。您必须使用 OPEN 语句来激活这些游标。

使用 OPEN 语句的 USING 子句中的集合变量的名称。要获取更多关于以集合变量使用 OPEN ... USING 的信息,请参阅 从集合游标访存 和 插入到 Collection 游标内。

USING 子句

当游标与一个包括问号(?)占位符和准备好的语句相关联时,需要 USING 子句,如下:

  1. 在其 WHERE 子句中带有输入参数的 SELECT 语句
  2. 带有输入参数作为其用户定义的函数的参数的 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句
  3. 在其 VALUES 子句中带有输入参数的 INSERT 语句(在 ESQL/C 中)。

在 SPL 例程中,您必须指定这些参数作为 SPL 变量。

在 ESQL/C 中,您可以下列方式之一支持这些参数的值:

  1. 您可指定一个或多个主变量。
  2. 您可指定系统描述符区域。
  3. 您可指定指向 sqlda 结构的指针。

要获取更多信息,请参阅 PREPARE 语句。

如果您知道在运行时要提供的参数的数目和顺序及其数据类型,则可在程序中通过该语句将所需参数定义为主变量。通过以 USING 关键字打开游标,您按位置将参数传递给数据库服务器,后跟依其序列顺序的变量的名称。从左至右,这些变量以一一对应的方式与 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句问号(?)占位符相匹配。

在变量的列表中,您不可包括 ESQL/C 的指示符变量。要使用指示符变量,您必须包括 SELECT 或 EXECUTE FUNCTION(或 EXECUTE PROCEDURE)语句文本作为 DECLARE 语句的一部分,而不是准备好的语句的标识符。

您必须为每一占位符提供一个主变量名称。每一变量的数据类型必须与准备好的语句所需要的相应的类型相兼容。下列 GBase 8s ESQL/C 代码片段打开 Select 游标并在 USING 子句中指定主变量:

sprintf (select_1, "%s %s %s %s %s",

"SELECT o.order_num, sum(total price)",

"FROM orders o, items i",

"WHERE o.order_date > ? AND o.customer_num = ?",

"AND o.order_num = i.order_num",

"GROUP BY o.order_num");

EXEC SQL prepare statement_1 from :select_1;

EXEC SQL declare q_curs cursor for statement_1;

EXEC SQL open q_curs using :o_date, :o.customer_num;

下列示例展示在 GBase 8s ESQL/C 代码片段中,带有 EXECUTE FUNCTION 语句的 OPEN 语句的 USING 子句:

stcopy ("EXECUTE FUNCTION one_func(?, ?)", exfunc_stmt);

EXEC SQL prepare exfunc_id from :exfunc_stmt;

EXEC SQL declare func_curs cursor for exfunc_id;

EXEC SQL open func_curs using :arg1, :arg2;

南大通用GBase8s 常用SQL语句(168)相关推荐

  1. 南大通用GBase8s 常用SQL语句(八十三)

    南大通用GBase8s 常用SQL语句(八十三) Interval fragment 子句 使用 Interval Fragment 子句存储通过一个或多个计算为数字或 INTERVAL 数据类型的范 ...

  2. 南大通用GBase8s 常用SQL语句(八十)

    南大通用GBase8s 常用SQL语句(八十) FRAGMENT BY 子句 使用 FRAGMENT BY 子句创建分片表并指定它的存储分布方案.PARTITION BY 关键字是 FRAGMENT ...

  3. 南大通用GBase8s 常用SQL语句(八十一)

    南大通用GBase8s 常用SQL语句(八十一) 使用 REMAINDER 关键字 使用 REMAINDER 关键字来指定存储超出指定表达式的有效值的存储空间.如果不指定 remainder ,并且在 ...

  4. 南大通用GBase8s 常用SQL语句(四十)

    南大通用GBase8s 常用SQL语句(四十) DATAFILES 子句 DATAFILES 子句指定当您使用外部表时打开的操作系统文件或管道. DATAFILES 子句 元素 描述 限制 语法 fi ...

  5. 南大通用GBase8s 常用SQL语句(261)

    使用 Cursor Stability 隔离级别 使用 Cursor Stability 选项来在获取的行上放置共享锁,当您获取另一行或关闭该游标时,将其释放.另一进程还可在同一行上放置共享锁,但没有 ...

  6. 南大通用GBase8s 常用SQL语句(124)

    DROP INDEX 语句 使用 DROP INDEX 语句删除索引. 该语句是 SQL ANSI/ISO 标准的扩展. 语法 元素 描述 限制 语法 index 要删除的索引的名称 必须存在于当前数 ...

  7. 南大通用GBase8s 常用SQL语句(100)

    用于插入的 REFERENCING 子句 Insert 触发器的 REFERENCING 子句可以为列中要插入的值声明相关名称. 用于插入的 REFERENCING 子句 元素 描述 限制 语法 co ...

  8. 南大通用GBase8s 常用SQL语句(257)

    完整连接级别设置和输出示例 SET EXPLAIN 语句支持完整连接级别设置. SET EXPLAIN 语句支持完整连接级别设置.这意味着在连接时将本地会话环境中的值传播到所有下列类型的新的或恢复的事 ...

  9. 南大通用GBase8s 常用SQL语句(108)

    CREATE VIEW 语句 使用 CREATE VIEW 语句创建新的视图,该视图基于驻留在数据库(或本地数据库服务器或不同的数据库服务器中的另一个数据库)中的一个或多个现有表和视图. 语法 元素 ...

  10. 南大通用GBase8s 常用SQL语句(259)

    SET ISOLATION 语句 使用 SET ISOLATION 语句来定义在尝试同时地访问相同行的进程之中的并发程度. 此语句是对 SQL 的 ANSI/ISO 标准的扩展. 语法 用法 SET ...

最新文章

  1. 关于学习Python的一点学习总结(18->序列解包)
  2. c#实现数据集合转换为csv文本
  3. 【CyberSecurityLearning 77】DC系列之DC-8渗透测试(Drupal)
  4. 解惑:如何使用html+css+js实现旋转相册,立方体相册等动画效果
  5. 【重大修改】动态时间规整(Dynamic Time Warping)
  6. Oracle入门(十四.16)之捕获用户定义的异常
  7. 搜索计算机硬盘的索引恢复,可以做到秒搜的神器everything,你可知对硬盘到底有多大伤害...
  8. 7.3图的遍历(深度优先)-理论
  9. 淘宝Hadoop现有测试框架探幽
  10. 如何用matlab画正态分布曲线
  11. 基于modelsim的十个Verilog入门试验程序(1)(7人表决器+算术逻辑单元)—程序+测试代码+波形+结果分析
  12. 怎么把线稿提取出来_PS教程:提取线稿如此简单?三种方法总有一种适合你
  13. 《linux核心应用命令速查》连载四:at:定时运行命令
  14. JS学习笔记(不断更新)
  15. Android -- Layout布局文件里的android:layout_height等属性为什么会不起作用?
  16. 2018年第九届蓝桥杯真题Java B组
  17. Axure基本使用(一)
  18. 《小猫猫大课堂》1——小喵是如何开启敲代码之路的?
  19. Triple-Speed Ethernet(tse)FPGA软核MAC测试
  20. 泛泰长短信修改教程(供其他泛泰机型参考)

热门文章

  1. Cisco交换机端口聚合配置
  2. 切身体会创业型企业的种种问题!---来自好友的博客
  3. 机器人/无人驾驶参考资源
  4. html 文字浮动flash上,360浏览器让div漂浮在flash上面(div与flash层叠问题)
  5. rsync_sersync实现实时同步
  6. Linux系统编程(四)--进程间关系
  7. 通才计算机学校 顺发分校,通识教育与通才教育才是培优之道
  8. 一次Linux线上系统page allocation failure问题处理实战记录
  9. 录取通知书玩出新花样,西工大加入AR技术
  10. 图灵访谈之二十二——Brian W. Kernighan与CS的半个世纪 (翻译)