返回首页

gbase数据、南大通用产品文档:GBase8s

更新日期:2024年09月11日

SUM(DISTINCT)
9
VARIANCE

本部分描述如何处理带有系统描述符区域的参数化的 SELECT 语句。如果
准备好的 SELECT 语句有带有未知数目和数据类型的输入参数的 WHERE 子句,
则您的 GBase 8s ESQL/C 程序必须使用系统描述符区域来定义输入参数。

要使用系统描述符区域来定义 WHERE 子句的输入参数:

1. 确定 SELECT 语句的输入参数的数目和数据类型。
2. 分配系统描述符区域,并以 ALLOCATE
DESCRIPTOR 语句为它指定名
称。
3. 以 SET
DESCRIPTOR 语句指示 WHERE 子句中输入参数的数目,其设
置 COUNT 字段。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 538 -
4. 以 SET DESCRIPTOR 语句存储该定义和每一输入参数的值,其设置
在恰当的项描述符中的 DATA、TYPE 和 LENGTH 字段:
 TYPE 字段必须使用在 sqltypes.h 头文件中定义的 GBase
8s ESQL/C 数据类型常量来表示输入参数的数据类型。
对于 CHAR 或 VARCHAR 值,LENGTH 是以字节计的字符数组的大小;对于
DATETIME 或 INTERVAL 值,LENGTH 字段存储编码的限定符。
重要: 如果您使用 X/Open 代码(且以 -xopen 标志编译),则对于 TYPE 和
ITYPE 字段,您必须使用 X/Open 数据类型值。

如果您使用指示符变量,则您还需要设置 INDICATOR 字段,可能以及 IDATA、
ILENGTH 和 ITYPE 字段
(仅限于非 X/Open 应用程序)

请使用 SET
DESCRIPTOR
的 VALUE 关键字来标识项描述符。

5. 以 USING SQL DESCRIPTOR 子句将定义了的输入参数从系统描述符
区域传至数据库服务器。
提供输入参数的语句依赖于该 SELECT 语句返回多少行。后面的部分讨论如何执行
每一类 SELECT 语句。

6. 以 DEALLOCATE DESCRIPTOR 语句释放系统描述符区域。

重要: 如果 SELECT 语句在选择列表中有未知的列,则您的程序还必须处
理这些带有系统描述符区域的列。
执行返回多行的参数化的 SELECT
下列样例程序展示如何使用带有下列条件的动态 SELECT 语句:
SELECT 返回多行。
该 SELECT 必须与游标相关联,以 OPEN 语句执行,并有以 FETCH...USING SQL
DESCRIPTOR 语句检索的它的返回值。

该 SELECT 在它的 WHERE 子句中有输入参数。
OPEN 语句包括 USING SQL DESCRIPTOR 子句来提供系统描述符区域中的参数值。


该 SELECT 在选择列表中有未知的列。
FETCH 语句包括 USING SQL DESCRIPTOR 子句来在系统描述符区域中存储返回
值。
使用动态 SELECT 语句的样例程序
该程序是 demo4.ec 样例程序的一个版本;demo4 使用选择列表列的系统描述符区域,
而本 demo4 的修改版本对于选择列表列和 WHERE 子句的输入参数同时使用系统描述符

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 539 -
区域。

=================================================================
======
1. #include
2. EXEC SQL include sqltypes;
3.
4. EXEC SQL define NAME_LEN 15;
5. EXEC SQL define MAX_IDESC 4;
6. main()
7. {
8. EXEC SQL BEGIN DECLARE SECTION;
9. int i;
10. int desc_count;
11. char demoquery[80];
12. char queryvalue[2];
13. char result[ NAME_LEN + 1 ];
14. EXEC SQL END DECLARE SECTION;
15. printf("Modified DEMO4 Sample ESQL program running.\n\n");
16. EXEC SQL connect to 'stores7';

=====================================================================
==

8 - 14 行

这些行声明主变量来保存从用户取得的数据,以及从系统描述符检索的列值。


=================================================================
======
17. /* These next three lines have hard-wired both the query and
18. * the value for the parameter. This information could have
19. * been entered from the terminal and placed into the strings

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 540 -
20. * demoquery and queryvalue, respectively.
21. */
22. sprintf(demoquery, "%s %s",
23. "select fname, lname from customer",
24. "where lname < ? ");
25. EXEC SQL prepare demoid from :demoquery;
26. EXEC SQL declare democursor cursor for demoid;
27. EXEC SQL allocate descriptor 'demodesc' with max MAX_IDESC;

=====================================================================
==

17 - 25 行

这些行为(demoquery)中的语句组装字符串,并准备它作为 demoid 语句
标识符。问号(?)指示 WHERE 子句中的输入参数。

26 行

此行为准备好的语句标识符 demoid 声明 democursor 游标。
所有非单个的 SELECT
语句都必须有一个声明了的游标。


27 行

要能够使用输入参数的系统描述符区域,您必须首先分配该系统描述符区
域。此 ALLOCATE DESCRIPTOR 语句分配 demodesc 系统描述符区域。


=================================================================
======
28. /* This section of the program must evaluate :demoquery
29. * to count how many question marks are in the where
30. * clause and what kind of data type is expected for each
31. * question mark.

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 541 -
32. * For this example, there is one parameter of type
33. * char(15). It would then obtain the value for
34. * :queryvalue. The value of queryvalue is hard-wired in
35. * the next line.
36. */
37. sprintf(queryvalue, "C");
38. desc_count = 1;
39. if(desc_count > MAX_IDESC)
40. {
41. EXEC SQL deallocate descriptor 'demodesc';
42. EXEC SQL allocate descriptor 'demodesc' with max :desc_count;
43. }
44. /* number of parameters to be held in descriptor is 1 */
45. EXEC SQL set descriptor 'demodesc' COUNT = :desc_count;

=====================================================================
==

28 - 38 行

这些行模仿输入参数值的动态条目。虽然该参数值在此为硬编码(37 行),但该程
序更可能会从用户输入取得该值。
38 行模仿会确定在语句字符串中存在多少输入参数的代
码。如果您不知道此值,则您会需要包括 C 代码来为问号(?)字符解析该语句字符串。


39 - 43 行

对于参数化的 SELECT 语句,
此 if 语句确定 demodesc 系统描述符区域是否包含足
够的项描述符。
它将语句字符串中的输入参数的数目(desc_count)与当前实际分配的项描
述符的数目(MAX_IDESC)相比较。如果该程序尚未分配足够的项描述符,则该程序释放
现有的系统描述符区域(41 行),并分配新的(42 行);它使用 WITH MAX 子句中输
入参数的实际数目来指定要分配的项描述符的数目。



GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 542 -
44 和 45 行

此 SET DESCRIPTOR 语句在 demodesc 系统描述符区域的 COUNT 字段中存储输
入参数的数目。


=================================================================
======
46. /* Put the value of the parameter into the descriptor */
47. i = SQLCHAR;
48. EXEC SQL set descriptor 'demodesc' VALUE 1
49. TYPE = :i, LENGTH = 15, DATA = :queryvalue;
50. /* Associate the cursor with the parameter value */
51. EXEC SQL open democursor using sql descriptor :demodesc;
52. /*Reuse the descriptor to determine the contents of the Select-
* list*/
53. EXEC SQL describe qid using sql descriptor 'demodesc';
54. EXEC SQL get descriptor 'demodesc' :desc_count = COUNT;
55. printf("There are %d returned columns:\n", desc_count);
56. /* Print out what DESCRIBE returns */
57. for (i = 1; i <= desc_count; i++)
58. prsysdesc(i);
59. printf("\n\n");

=====================================================================
==

47 - 49 行

此 SET DESCRIPTOR 语句为 WHERE 子句中的每一参数设置 TYPE、
LENGTH
(对
于 CHAR 值)和 DATA 字段。该程序仅调用 SET DESCRIPTOR 一次,因为它假设该
SELECT 语句仅有一个输入参数。如果您在编译时刻不知道输入参数的数目,则请将 SET
DESCRIPTOR 放至循环中,desc_count 主变量为其控制迭代的数目。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 543 -

50 和 51 行

当数据库服务器打开 democursor 游标时,
它执行 SELECT 语句。
此 OPEN 语句包
括 USING SQL DESCRIPTOR 子句来指定 demodesc 系统描述符区域作为输入参数值的
位置。


52 - 59 行

该程序还使用 demodesc 系统描述符区域来保存由 SELECT 语句返回的列。
DESCRIBE 语句(53 行)检测选择列表,来确定这些列的数目的数据类型。然
后,GET
DESCRIPTOR 语句(54 行)从 demodesc 的 COUNT 字段获得描述的列
的数目。然后,55 - 58 行显示每一返回的列的列信息。

=================================================================
======
60. for (;;)
61. {
62. EXEC SQL fetch democursor using sql descriptor 'demodesc';
63. if (sqlca.sqlcode != 0) break;
64. for (i = 1; i <= desc_count; i++)
65. {
66. EXEC SQL get descriptor 'demodesc' VALUE :i :result = DATA;
67. printf("%s ", result);
68. }
69. printf("\n");
70. }
71. if(strncmp(SQLSTATE, "02", 2) != 0)
72. printf("SQLSTATE after fetch is %s\n", SQLSTATE);
73. EXEC SQL close democursor;
74. EXEC SQL free demoid; /* free resources for statement */
75. EXEC SQL free democursor; /* free resources for cursor */
76. /* free system-descriptor area */

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 544 -
77. EXEC SQL deallocate descriptor 'demodesc';
78. EXEC SQL disconnect current;
79. printf("\nModified DEMO4 Program Over.\n\n");
80. }

=====================================================================
==

60 - 70 行

对于选择列表中的每一列,这些行访问项描述符的字段。在每一 FETCH 语句之后,
GET DESCRIPTOR 语句将 DATA 字段的内容加载至 result 主变量内。


73 行

访存所有行之后,CLOSE 语句释放分配给 democursor 游标的活动集的资源。


74 - 77 行

在 75 行的 FREE 语句释放分配给 democursor 游标的资源时,74 行的
FREE 语句释放分配给 demoid 语句标识符的资源。DEALLOCATE DESCRIPTOR 语
句释放分配给 demodesc 系统标识符区域的资源。
执行参数化的单个 SELECT 语句
前一部分中的说明,
假设该参数化的 SELECT 语句返回多行,
因此,
与游标相关联。
如果您在编写该程序的时候知道,
该参数化的 SELECT 语句总是只返回一行,
则您可省略
该游标,并使用 EXECUTE...USING SQL DESCRIPTOR...INTO 语句,而不是
OPEN...USING SQL DESCRIPTOR 语句,来指定来自系统描述符区域的参数值。

PG_RUNNING_XACTS 视图主要功能是显示当前节点运行事务的信息。
名称
类型
描述
handle
integer
事务对应的事务管理器中的槽位句柄,该值恒为-1。
gxid
xid
事务id 号。
state
tinyint
事务状态(3:prepared 或者0:starting)。
node
text
节点名称。
xmin
xid
节点上当前数据涉及的最小事务号xmin。
vacuum
Boolean
标志当前事务是否是lazy vacuum 事务。
t(true):表示是。
f(false):表示否。
timeline
bigint
标志数据库重启次数。
prepare_xid
xid
处于prepared 状态的事务的id 号,若不在prepared 状

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
883
名称
类型
描述
态,值为0。
pid
bigint
事务对应的线程id。
next_xid
xid
其余节点发送给当前节点的事务id,该值恒为0。