构建与 DB2 停止交互的使用步伐

机关嵌入式 SQL 使用步伐

声明宿主变量

在前面,我们清楚明明到 DB2 Database Manager 依靠宿主变量在使用步谐和数据库之间挪动数据。我们还知道要在称为声明段的公用区域中界说宿主变量,以此区分宿主变量和其他初级编程语言变量。那么,该若何编写声明段呢?

声明段的扫尾由 BEGIN DECLARE SECTION SQL 语句界说,而扫尾由 END DECLARE SECTION 语句界说。因此,C/C 源代码文件中典型的声明段如下所示:

...
// Define The SQL Host Variables Needed
EXEC SQL BEGIN DECLARE SECTION;char    EmployeeID[7];char    WorkDept[4];char    Job[9];char    Sex[2];double  Salary;double  Bonus;double  Commision;
EXEC SQL END DECLARE SECTION;
...

在源代码文件中,在可以编写初级编程语言变量声明的任何中间,都可以编写声明段。虽然一个源代码文件凡是只包罗一个声明段,但多个声明段也是应允的。将数据传输到数据库中的宿主变量称作输出宿主变量(input host variable),而从数据库领受数据的宿主变量则称作输出宿主变量(output host variable)。不论宿主变量是用于输出还是输出,其属性都必需恰当于运用它的上下文。因此,在界说宿主变量时,必需使其数据范例和长度与它们将要把持的列的数据范例和长度相兼容。另外,必需给使用步伐中运用的每个宿主变量指定一个专注的称呼,同等文件中不该允运用重复的称呼,即便在运用多个声明段的情况下也是云云。一个名为 Declaration Generator 的器材可以用于为数据库中给定表的列天生宿主变量声明。该器材创立嵌入式 SQL 声明源代码文件,这些文件可轻松地拔出 C/C 、Java 语言、COBOL 和 FORTRAN 使用步伐中。关于该实用器材的更多信息,请查阅 DB2 UDB Command Reference 中的 db2dclgn 下令。若何运用宿主变量在使用步谐和数据库之间挪动数据呢?回覆该题目成绩最俭朴的编制是反省一个俭朴的嵌入式 SQL 源代码片段,比喻清单 1 中的代码段。

清单 1. 宿主变量的正确运用编制

...
// Define The SQL Host Variables Needed
EXEC SQL BEGIN DECLARE SECTION;char     EmployeeNo[7];char     LastName[16];
EXEC SQL END DECLARE SECTION;
...
// Retrieve A Record From The Database
EXEC SQL SELECT empno, lastname INTO :EmployeeNo, :LastName FROM employee WHERE empno = '000100';
// Do Something With The Results
...

在这个示例中,当实验 SQL 语句 SELECT empno, lastname FROM employee WHERE empno = '000100' 时,下场被传输给宿主变量 EmployeeNoLastName。在对源代码文件停止预编译时,会添加实验这一数据传输的现实下令和函数。





回页首

声明指示器变量

默许情况下,DB2 数据库表中的列可以包罗空(null)值。由于空值的存储编制与旧规数据不同,所以若是使用步伐筹算运用 null 数据,就必需授与特殊门径。空值不能像其他数据值一样被检索和复制到宿主变量中,而是必需反省一个特殊标记以鉴别特定值可否为空。为了获得该标记的值,必需将名为指示器变量(或 null 指示器变量)的公用变量与一个可空列的宿主变量接洽相干起来。

由于指示器变量必需让 DB2 Database Manager 和使用步伐都能接见到,所以必需在声明段中界说它们。还必需给它们指派与 DB2 UDB SMALLINT 数据范例兼容的数据范例。因此,C/C 源代码文件中用于界说指示器变量的代码如下所示:

// Define The SQL Host Variables Needed
EXEC SQL BEGIN DECLARE SECTION;short   SalaryNullIndicator;
EXEC SQL END DECLARE SECTION;

当指示器变量在 SQL 语句中紧随着一个特定的宿主变量呈现时,它就与该宿主变量相接洽相干。指示器变量一旦与宿主变量相接洽相干,那么在加添与之照应的宿主变量尔后,就可以反省它。若是指示器变量包罗的是一个负值,就透露表现找到了一个空值,并应该忽略其照应的宿主变量值。否则,照应的宿主变量值就是无效的。

异样,为明认识若何运用指示器变量,我们来看一个嵌入式 SQL 源代码段。清单 2 是用 C 编程语言编写的代码,它展示了若何界说和运用指示器变量:

清单 2. 指示器变量的正确运用编制

...
// Define The SQL Host Variables Needed
EXEC SQL BEGIN DECLARE SECTION;char     EmployeeNo[7];double   Salary;    // Salary - Used If SalaryNI Is Positive ( >= 0 )short    SalaryNI;  // Salary NULL Indicator - Used// To Determine If Salary// Value Should Be NULL
EXEC SQL END DECLARE SECTION;
...
// Declare A Static Cursor
EXEC SQL DECLARE cursor1 CURSOR FOR SELECT empno, DOUBLE(salary)FROM employee;
// Open The Cursor
EXEC SQL OPEN cursor1;
// If The Cursor Was Opened Successfully, Retrieve And
// Display All Records Available
while (sqlca.sqlcode == SQL_RC_OK)
{// Retrieve The Current Record From The CursorEXEC SQL FETCH cursor1 INTO :EmployeeNo, :Salary :SalaryNI;// if The Salary Value For The Record Is NULL, ...if (SalaryNI < 0){printf("No salary information is available for ");printf("employee %s\n", EmployeeNo);}
}
// Close The Open Cursor
EXEC SQL CLOSE C1;
...

指示器变量还可以在实验拔出或更新把持时,用于向数据库发送空值。在措置 INSERTUPDATE SQL 语句时,DB2 Database Manager 起首反省所提供的十足指示器变量的值;若是一个或多个指示器变量包罗一个负值,它就给照应的列指派 null 值,假定该列支撑空值。(若是指示器变量被设置为零或包罗一个正数,或许若是未运用指示器变量,那么 DB2 Database Manager 将照应的宿主变量中存储的值指派给照应的列。)因此,C/C 源代码文件中用于给表中一列指派 null 值的代码如下所示:

ValueInd = -1;
EXEC SQL INSERT INTO tab1 VALUES (:Value :ValueInd);





回页首

SQLCA 数据机关

到目前为止,我们只钻研了若何运用宿主变量和指示器变量在嵌入式 SQL 使用步谐和数据库对象之间挪动数据。但是,嵌入式 SQL 使用步伐有时间需要与 DB2 Database Manager 自己停止通信。两种特殊的 SQL 数据机关用于设立树立这种告急的通信链接:SQL Communications Area(SQLCA)数据机关和 SQL Descriptor Area(SQLDA)数据机关。

SQLCA 数据机关包罗每当实验 SQL 语句或 DB2 治理 API 函数时,由 DB2 Database Manager 更新的元素鸠合。为了让 DB2 Database Manager 加添该数据机关,就必需起首存在该机关。因此,任何包罗嵌入式 SQL 或许要调用一个或更多治理 API 的使用步伐必需界说至多一个 SQLCA 数据机关变量。现实上,若是不存在 SQLCA 数据机关变量,使用步伐就无法乐成编译。

那么,SQLCA 数据机关变量是什么样的呢?表 1 列出了组成 SQLCA 数据机关变量的元素。

表 1. SQLCA 数据机关的元素

元素称呼 数据范例 描述
sqlcaid CHAR(8) 信息转储的可视标记。为了辅助可视化地识别该数据机关,该元素凡是包罗值 "SQLCA"。若是在剖析 SQL 历程体时前往了行号信息,那么第 6 个字节包罗字符 L
sqlcabc INTEGER SQLCA 数据机关自己的大大小,以字节为单位。该元素总是应该包罗值 136
sqlcode INTEGER SQL 前往码值。值为 0 透露表现实验乐成,正值透露表现实验乐成,但发出警告,而负值则透露表现出错。请查阅 DB2 UDB Message Reference 产品手册第 1 和 2 卷(拜见 参考资料),获得关于特定 SQL 前往码值的更多信息。
sqlerrml SMALLINT 该机关的 sqlerrmc 元素中所存储的数据大大小,以字节为单位。该值可所以 070 之间的任何数字;值为 0 透露表现 sqlerrmc 字段中未存储任何数据。
sqlerrmc CHAR(70) 由值 "0xFF" 分隔的一个或多个错误音讯标记,它们将取代警告或错误情况描述中的变量。当乐成设立树立毗连时,也要运用该元素。
sqlerrp CHAR(8) 透露表现以后所运用的 DB2 任事器范例的诊断值。该值以标识产品版本和颁布的三字母编码开始,紧接着是标识该产品修正级其它 5 位数字。比喻,SQL09010 意味 DB2 版本 9,颁布 1,修正级别 0。若是 sqlcode 元素包罗一个负值,那么该元素将包罗一个标识陈说错误的模块的 8 字符编码。
sqlerrd INTEGER ARRAY 由六个整型值组成的数组,它在发作错误时提供附加的诊断信息(关于该元素中可以前往的诊断信息的更多信息,请查阅 表 2)。
sqlwarn CHAR(11) 一个由用作警告指示器的字符值组成的数组;数组的每个元素要么包罗一个空格,要么包罗字母 W。若是运用了复合 SQL,该字段将包罗一些警告指示器,它们是为复合 SQL 语句块中实验的十足子语句设置的。(关于该元素中可以前往的警告信息范例的更多信息,请查阅 表 3。)
sqlstate CHAR(5) 标识比来实验的 SQL 语句下场的 SQLSTATE 值。(我们将在 SQLSTATE 一节中留心批判冲突 SQLSTATE 值。)

表 2 给出了 sqlca.sqlerrd 数组中的元素。

表 2. sqlerrd 数组元素

数组元素 描述
sqlerrd[0]

若是乐成设立树立了毗连,那么在将混杂字符数据(CHAR 数据范例)从使用步伐代码页转换成数据库代码页时,该元素将包罗该数据预期的长度差。值为 01 透露表现不需要停止扩展;大大于 1 的正值透露表现梗提要扩展的长度;而负值则透露表现梗提要减小的长度。

若是乐成实验了 SQL 存储历程,这个元素就包罗历程的前往状态。

sqlerrd[1]

若是乐成设立树立了毗连,那么在将混杂字符数据(CHAR 数据范例)从使用步伐代码页转换成数据库代码页时,该元素将包罗该数据预期的长度差。值为 01 透露表现不需要停止扩展;大大于 1 的正值透露表现梗提要扩展的长度;而负值则透露表现梗提要减小的长度。

若是 SQLCA 数据机关包罗 NOT ATOMIC 复合 SQL 语句的信息,该元素将包罗遇到错误的子语句的数量(若是有子语句失败的话)。

sqlerrd[2]

若是 SQLCA 数据机关包罗乐成实验的 CONNECT SQL 语句的信息,那么当所毗连的数据库为可更新的功夫,该元素将包罗值 1;当所毗连的数据库为只读的功夫,则包罗值 2

若是 SQLCA 数据机关包罗乐成实验的 PREPARE SQL 语句的信息,该元素将包罗关于实验所准备的语句时下场数据集中将前往的行数的预计值。

若是 SQLCA 数据机关包罗乐成实验的 INSERTUPDATEDELETE SQL 语句的信息,该元素将包罗该把持所影响的行数。

若是 SQLCA 数据机关包罗乐成实验的 OPEN SQL 语句以及用来实验拔出、更新和删除把持的游标的信息,该元素将包罗该把持所影响的行数。

若是 SQLCA 数据机关包罗在剖析 SQL 历程体时遇到错误的 CREATE PROCEDURE SQL 语句的信息,该元素将包罗遇到错误之处的行号。

若是 SQLCA 数据机关包罗复合 SQL 语句的信息,该元素将包罗遭到复合 SQL 语句块中子语句影响的行数。

sqlerrd[3]

若是 SQLCA 数据机关包罗乐成实验的 CONNECT SQL 语句的信息,当运用来自下级客户机的一阶段提交(commit)时,该元素将包罗值 0;当运用一阶段提交时,将包罗值 1;当运用一阶段只读提交时,将包罗值 2;而当运用两阶段提交时,则会包罗值 3

若是 SQLCA 数据机关包罗实验乐成的 PREPARE SQL 语句的信息,该元素将包罗准备指定语句所需资源的相对资源预计。

若是 SQLCA 数据机关包罗复合 SQL 语句的信息,该元素将包罗复合 SQL 语句块中乐成实验的子语句数量。

sqlerrd[4]

若是 SQLCA 数据机关包罗乐成实验的 CONNECT SQL 语句的信息,当运用任事器身份验证时,该元素将包罗值 0;当运用客户机身份验证时,将包罗值 1;当由 DB2 Connect 来停止身份验证时,将包罗值 2;当运用 SERVER_ENCRYPT 身份验证时,将包罗值 4;当运用带加密身份验证的 DB2 Connect 时,将包罗值 5;当运用 KERBEROS 身份验证时,将包罗值 7;当运用 GSSPLUGIN 身份验证时,将包罗值 9;当运用 DATA_ENCRYPT 身份验证时,将包罗值 11;而当无法确定身份验证的措置编制时,将包罗值 255

若是 SQLCA 数据机关包罗任何其他信息,该元素将包罗已拔出、更新或删除的总行数,而这些拔出、更新或删除把持是由一个或多个引用齐备性束缚的 DELETE 礼貌或由一个或更多触发器的激活招致的。

若是 SQLCA 数据机关包罗复合 SQL 语句的信息,该元素将包罗复合 SQL 语句块中乐成实验的每个子语句对应的这种行的总数。

sqlerrd[5] 关于分区数据库,该元素包罗遇到错误或警告的分区的分区号。若是未遇到错误或警告,该元素将包罗用作协调度点的分区的分区号。

最后,表 3 描述了 sqlca.sqlwarn 数组的元素。

表 3. sqlwarn 数组的元素

数组元素 描述
sqlwarn[0] 若是该数组中的十足其他元素都为空,该元素就为空;若是有一个或多个其他元素不为空,它就包罗字符 W
sqlwarn[1]

在将字符串数据范例的列值指派给宿主变量时,若是截断了字符串值,该元素就包罗字符 W

若是截断了字符串的 null 截止符,它就包罗字符 N

若是 CONNECTATTACH 把持乐成实验,并且毗连的授权名擅长 8 字节,它就包罗字符 A

若是 sqlerrd[3] 中存储的 PREPARE 语句相对资源预计值大大于 INTEGER 数据范例可以存储的数量或许小于 1,并且 CURRENT EXPLAIN MODECURRENT EXPLAIN SNAPSHOT 特殊寄存器设置为 NO 之外的其他值,它就包罗字符 P

sqlwarn[2]

若是断根了通报给函数的参数中的 null 值,该元素就包罗字符 W

若是 SQLCA 数据机关包罗实验乐成的 CONNECT SQL 语句的信息,那么在数据库处于静默状态时,该元素就包罗字符 D;在实例处于静默状态时,该元素就包罗字符 I

sqlwarn[3]

若是所检索值的数量不即是所提供的宿主变量的数量,该元素就包罗字符 W

若是用 ASSOCIATE LOCATORS SQL 语句指定的下场数据集定位器数量少于调用的历程所前往的下场数据集的现实数量,该元素就包罗字符 Z

sqlwarn[4] 若是所准备的 UPDATEDELETE SQL 语句不包罗 WHERE 从句,该元素就包罗字符 W
sqlwarn[5] 若是在 SQL 语句实验时代容忍了一个错误,该元素就包罗字符 E
sqlwarn[6] 若是调停了日期的比赛争论下场以防范无效的日期值,该元素就包罗字符 W
sqlwarn[7] 若是 SQLCA 数据机关包罗实验乐成的 CONNECT SQL 语句的信息,并且启用了 DYN_QUERY_MGMT 数据库设置参数,该元素就包罗字符 E
sqlwarn[8] 若是用替代字符取代了无法停止转换的字符,该元素就包罗字符 W
sqlwarn[9] 若是在措置列函数时代忽略了算术表达式中的一个或多个错误,该元素就包罗字符 W
sqlwarn[10] 若是在转换 SQLCA 数据机关变量的另一个元素中的字符数据值时发作了转换错误,该元素就包罗字符 W

SQLCA 数据机关变量和 SQLDA 数据机关变量(上面将留心批判冲突)可以经由历程在嵌入式 SQL 源代码文件中嵌入恰当编制的 INCLUDE SQL 语句(离别运用 INCLUDE SQLCAINCLUDE SQLDA)来创立。





回页首

SQLDA 数据机关

SQL Descriptor Area(SQLDA)数据机关包罗用来向 PREPAREOPENFETCHEXECUTE SQL 语句提供留心信息的元素鸠合。该数据机关包罗一个头以及一个数组机关,该数组中的每个元素描述一个宿主变量或下场数据集中的一列。表 4 列出了组成 SQLDA 数据机关变量的元素。

表 4. SQLDA 数据机关变量的元素

元素称呼 数据范例 描述
sqldaid CHAR(8) 信息转储的可视标记。为了辅助可视化地识别该数据机关,该元素凡是包罗值 "SQLDA"。这个字段的第 7 个字节是称为 SQLDOUBLED 的标记;若为每个列创立了两个 sqlvar 条目,或许描述的任何宿主变量是机关范例,那么 DB2 Database Manager 将这个字节设置为 2,否则设置为 BLOBCLOBDBCLOB 数据范例。
sqldabc INTEGER QLDA 数据机关自己的大大小,以字节为单位。指派给该元素的值要经由历程算式 sqldabc = 16 (44 * sqln)(关于 32 位把持系统)或 sqldabc = 16 (56 * sqln)(关于 64 位把持系统)来确定。
sqln SMALLINT sqlvar 数组中元素的总数量。
sqld SMALLINT 该元素可以指出下列两者之一:由 DESCRIBEPREPARE SQL 语句前往的下场数据集中列的数量,或由 sqlvar 数组中元素描述的宿主变量的数量。
sqlvar STRUCTURE ARRAY 包罗宿主变量或下场集列的有关信息的数据机关数组。

除了这些基础信息之外,SQLDA 数据机关变量还包罗恣意数量的 sqlvar 数据机关(也称为 SQLVAR 变量)。每个 SQLVAR 变量中所存储的信息取决于运用照应的 SQLDA 数据机关变量的地位:当与 PREPAREDESCRIBE SQL 语句一起运用时,每个 SQLVAR 变量将包罗实验准备的 SQL 语句时所产生的下场数据集中的列的有关信息。(若是存在具丰大大型对象(LOB)或用户界说数据范例的列,那么所运用的 SQLVAR 变量的数量将添加一倍,并将给 SQLDA 数据机关变量的 sqldaid 元素中存储的字符串值的第 7 个字节指派值 2。)另一方面,当 SQLDA 数据机关变量与 OPENFETCHEXECUTE SQL 语句一起运用时,每个 SQLVAR 变量将包罗在实验语句时代其值将通报给 DB2 Database Manager 的宿主变量的有关信息。

可以运用两类 SQLVAR 变量:基础 SQLVAR 和辅助 SQLVAR。基础 SQLVAR 包罗下场数据集列或宿主变量的基础信息(比喻数据范例代码、长度属性、列名、宿主变量地址和指示器变量地址)。表 5 列出了组成基础 SQLVAR 数据机关变量的元素。

表 5. SQLVAR 数据机关元素

元素称呼 数据范例 描述
sqltype SMALLINT 所运用的宿主变量/参数标记的数据范例,或所产生的下场数据集中列的数据范例。
sqllen SMALLINT 所运用的宿主变量的长度,或所产生的下场数据集中列的大大小,以字节为单位。
sqldata Pointer 指向用于所运用的宿主变量的数据在内存中存储地位的指针,或指向用于所产生的下场数据集中列的数据将在内存中存储的地位的指针。
sqlind Pointer 指向与所运用的宿主变量相接洽相干的 null 指示器变量的数据在内存中存储地位的指针,或指向与所产生的下场数据集中列相接洽相干的 null 指示器变量的数据在内存中存储的地位的指针。
sqlname VARCHAR(30) 宿主变量或所产生的下场数据集中列的未限命名。

另一方面,辅助 SQLVAR 包罗用于不同数据范例的数据范例名,或许包罗列或宿主变量的长度属性和指向包罗 LOB 数据范例数据的真正长度的缓冲区的指针。只需在 SQLVAR 条目标数量翻倍(由于要运用 LOB 或差其它数据范例)时,才呈现辅助 SQLVAR 条目:若是运用定位器(locator)或文件引用变量透露表现 LOB 数据范例,就不需要辅助 SQLVAR 条目。

可以手工摆设(运用恰当的编程语言语句)SQLDA 数据机关变量中存储的信息,以及任何照应的 SQLVAR 变量中存储的信息,也可以经由历程实验 DESCRIBE SQL 语句主动天生。





回页首

设立树立数据库毗连

为了对数据库实验任何范例的把持,必需起首设立树立到数据库的毗连。在嵌入式 SQL 使用步伐中,经由历程实验 CONNECT SQL 语句来设立树立(某些情况下为截止)数据库毗连(CONNECT 语句的 RESET 选项用于截止毗连)。在毗连历程中,设立树立毗连所需的信息(比喻授权 ID 和授权用户照应的口令)将被通报给指定的数据库以停止无效性检验。凡是,在使用步伐运转时搜集该信息,并经由历程一个或多个宿主变量将其通报给 CONNECT 语句。因此,C/C 源代码文件中凡是用于设立树立数据库毗连的代码如清单 3 所示。

清单 3. 设立树立数据库毗连

...
// Define The SQL Host Variables Needed
EXEC SQL BEGIN DECLARE SECTION;char   DataSource[129] = {"SAMPLE"};char   UserID[129] = {"USER1"};char   Password[129] = {"User1PWD"};
EXEC SQL END DECLARE SECTION;
...
// Connect To The Appropriate Database
EXEC SQL CONNECT TO :DataSource USER :UserID USING :Password;
...
// Terminate The Database Connection
EXEC SQL CONNECT RESET;
...

嵌入式 SQL 使用步伐可以运用两种不同范例的毗连语义。这两种类型简称为 Type 1Type 2,它们支撑两种不同很大大的勾当:Type 1 毗连只支撑每个事故毗连一个数据库(称为长途使命单位),而 Type 2 毗连则支撑每个事故毗连多个数据库(称为使用步伐导向的漫衍式使命单位)。现实上,当运用 Type 1 毗连时,使用步伐一次只能毗连一个数据库。一旦设立树立了到数据库的毗连并启动事故,必需提交或回滚该事故,然后材干设立树立另一个数据库毗连。另一方面,当运用 Type 2 毗连时,使用步伐可以同时毗连几个差其它数据库,每个数据库毗连都将拥有它自己的事故鸠合。

嵌入式 SQL 使用步伐真正运用的毗连语义范例要由使用步伐预编译时指派给 CONNECTSQLRULESDISCONNECTSYNCPOINT SQL 预编译器选项的值来确定。





回页首

准备和实验 SQL 语句

当在使用步伐中嵌入静态 SQL 语句时,在遇到它们时就实验。但是,当运用静态 SQL 语句时,则可以用以下两种编制之一措置它们:

  • 准备和实验:这种编制将 SQL 语句的准备与它的真正实验分隔开,当要重复实验 SQL 语句时,凡是运用该编制。当使用步伐需要事后知道在实验 SELECT SQL 语句时所产生的下场数据集中存在的列的有关信息时,也运用该编制。SQL 语句 PREPAREEXECUTE 用于以该编制措置静态 SQL 语句。

  • 当即实验:这种编制将 SQL 语句的准备和实验组分解一步,当 SQL 语句只实验一次时,凡是运用该编制。当使用步伐不需要关于在实验 SQL 语句时将会产生的下场数据集(若是有的话)的附加信息时,也运用该编制。SQL 语句 EXECUTE IMMEDIATE 用于以该编制措置静态 SQL 语句。

在运转时准备和实验(运用任何一种编制)的静态 SQL 语句不该允包罗对宿主变量的引用。但是,它们可以包罗取代常数和表达式的参数标记。参数标记由问号(?)字符来透露表现,它们指明在实验该语句时,将在 SQL 语句中什么中间替代一个或多个宿主变量的以后值(或 SQLDA 数据机关变量的元素)。因此,若是所实验的 SQL 语句为静态的,则凡是在引用宿主变量的中间运用参数标记。可以运用两种类型的参数标记:范例化的和非范例化的。

范例化的参数标记是与在 SQL 语句中引用它时运用的目标数据范例一起指定的。范例化参数标记具有下列编制:

CAST( ? AS DataType )

这种透露表现法并不虞味着要调用函数;而是预示在使用步伐运转时替代参数标记的值的数据范例将为指定的数据范例,或许是可转换成指定数据范例的一种数据范例。比喻,思索下列 SQL 语句:

UPDATE employee SET lastname = CAST(? AS VARCHAR(12)) WHERE empno = '000050'

在这个示例中,LASTNAME 列的值将在使用步伐运转时提供,该值的数据范例将为 VARCHAR(12),或许是可转换成 VARCHAR(12) 的一种数据范例。

另一方面,非范例化的参数标记无需指定其目标数据范例,其透露表现编制只是一个问号(?)。非范例化参数标记的数据范例是经由历程运用它的上下文来确定的。比喻,在下列 SQL 语句中,LASTNAME 列的值在使用步伐运转时提供,并假定该值的数据范例将与指派给 EMPLOYEE 表中 LASTNAME 列的数据范例相兼容。

UPDATE employee SET lastname = ? WHERE empno = '000050'

当参数标记用在嵌入式 SQL 使用步伐中时,若 EXECUTEEXECUTE IMMEDIATE SQL 语句用于实验所指定的 SQL 语句,就必需将用来替代参数标记的值作为附加参数提提供它们。清单 4 是用 C 编程语言编写的示例,它阐认识打听明了若何将现实值提提供俭朴的 UPDATE SQL 语句中的参数标记。

清单 4. 运用参数标记

...
// Define The SQL Host Variables Needed
EXEC SQL BEGIN DECLARE SECTION;char   SQLStmt[80];char   JobType[10];
EXEC SQL END DECLARE SECTION;
...
// Define A Dynamic UPDATE SQL Statement That Uses A Parameter Marker
strcpy(SQLStmt, "UPDATE employee SET job = ? ");
strcat(SQLStmt, "WHERE job = 'DESIGNER'");
// Populate The Host Variable That Will Be Used In Place Of The Parameter Marker
strcpy(JobType, "MANAGER");
// Prepare The SQL Statement
EXEC SQL PREPARE SQL_STMT FROM :SQLStmt;
// Execute The SQL Statement
EXEC SQL EXECUTE SQL_STMT USING :JobType;
...





回页首

检索和措置下场

无论在嵌入式 SQL 使用步伐中运用的是静态 SQL 语句还是静态 SQL 语句,只需实验了该语句,就必需检索和措置所产生的下场。若是该 SQL 语句不是 SELECTVALUES 语句,实验之后就只需反省 SQLCA 数据机关变量,以确保该语句按预期实验。但是,若是实验的是查询,尤其是前往多行的查询,就需要附加的步骤,从而从所产生的下场数据集中检索数据。

当查询向使用步伐前往多行时,DB2 运用称为 “游标(cursor)” 的机制从所产生的下场数据集中检索数据值。“游标” 这个称呼梗概源冷静早期比赛争论机屏幕上看到的闪耀光标。正如光标指示出屏幕上的以后地位并识别上面输出的单词将呈现的地位一样,DB2 游标可用来指示出下场数据集中的以后地位(比喻,以后行),并识别将前往给使用步伐的下一个数据行。若是要将游标包罗在嵌入式 SQL 使用步伐中,就必需顺次实验下列步骤:

  1. 声明(界说)一个游标及其范例(只读的或可更新的),并将其与所需的查询接洽相干起来。这是经由历程实验 DECLARE CURSOR 语句来完成的。

  2. 掀开游标。这将招致实验照应的查询并产生下场数据集。这是经由历程实验 OPEN 语句来完成的。

  3. 一行行地检索(读取)下场数据集中存储的每一行,直到呈现数据完毕的条件。这是经由历程重复实验 FETCH 语句来完成的;宿主变量或 SQLDA 数据机关变量与 FETCH 语句结合运用,从下场数据集中提取一行数据。每当从下场数据集中检索一行时,游标就主动地移到下一行。

  4. 在恰当条件下,可以修正或删除以后行,但是仅当游标为可更新游标时材干这么做。这是经由历程实验 UPDATE 语句或 DELETE 语句来完成的。

  5. 关闭游标。这个把持招致删除实验照应查询时所产生的下场数据集。这是经由历程实验 CLOSE 语句来完成的。

既然我们已司清楚明明了为运用游标必需要实验的一些步骤,刻下当今就来批判冲突若安在使用步伐中编写这些步骤。清单 5 是用 C 编程语言编写的示例,它阐认识打听明了若何运用游标来检索一个俭朴查询的下场。

清单 5. 运用游标检索下场

...
// Declare The SQL Host Memory Variables
EXEC SQL BEGIN DECLARE SECTION;char      EmployeeNo[7];char      LastName[16];
EXEC SQL END DECLARE SECTION;
...
// Declare A Cursor
EXEC SQL DECLARE cursor1 CURSOR FORSELECT empno, lastnameFROM employeeWHERE job = 'DESIGNER';
// Open The Cursor
EXEC SQL OPEN cursor1;
// Fetch The Records
while (sqlca.sqlcode == SQL_RC_OK)
{// Retrieve A RecordEXEC SQL FETCH cursor1INTO :EmployeeNo, :LastName;// Process The Information Retrievedif (sqlca.sqlcode == SQL_RC_OK)...
}
// Close The Cursor
EXEC SQL CLOSE cursor1;
...

若是事前知道对查询的照应只会产生一行数据,就可以经由历程实验 SELECT INTO 语句或 VALUES INTO 语句将该行内容间接复制到宿主变量中。与 SELECT 语句一样,SELECT INTO 语句也可以用于机关复杂的查询。但与 SELECT 语句差其它是,SELECT INTO 语句的语法中需要提供一系列无效的宿主变量,无法静态地运用它。其它,若是实验 SELECT INTO 语句时产生的下场数据集中包罗多条记录,该把持就将失败,并天生一个错误。(若是所产生的下场数据集为空,就天生一个 NOT FOUND 警告。)

SELECT INTO 语句一样,VALUES INTO 语句可以用于检索与一条记录相接洽相干的数据,并将其复制到一个或多个宿主变量中。另外,与 SELECT INTO 语句一样,当实验 VALUES INTO 语句时,检索到的十足数据都存储在下场数据集中。若是这个下场数据集只包罗一条记录,就将该记录中的第一个值复制到所指定的第一个宿主变量中,将第二个值复制到所指定的第二个宿主变量中,顺次类推。若是所产生的下场数据集中包罗多条记录,该把持将失败,并天生一个错误。(异样,若是所产生的下场数据集为空,就天生一个 NOT FOUND 警告。)





回页首

治理事故

事故(也称为使命单位)是组分解一个单位的一个或多个 SQL 把持的序列,凡是包罗在一个使用步伐历程中。一个给定的事故可以包罗从一个把持到成百甚至上千个恣意数量的 SQL 把持,这取决于在营业逻辑中哪些步骤可以被组合为单一步骤。

事故的启动和截止界说了数据库中的数据不合性点:要么将事故中实验的十足把持的下场耐久地使用到数据库中(提交),要么撤消十足把持的下场(回滚),并使数据库前往到启动事故之前所处的状态。在大大大大都情况下,在设立树立了到数据库的毗连之后,或在紧接着前一个事故截止之后,第一次实验一条可实验的 SQL 语句时启动事故。一旦启动事故,就可以运用主动提交特性隐式地截止事故,还可以经由历程实验 COMMITROLLBACK SQL 语句显式地截止事故。若是启用了主动提交特性,每个可实验的 SQL 语句就被视为零丁的事故;若是该语句实验乐成,那么它所停止的任何修正都将使用到数据库中;若是该语句失败,则会抛弃十足修正。





回页首

综合

既然我们曾经批判冲突了用于机关嵌入式 SQL 使用步伐的一些基础组件,刻下当今就来看一看若何将它们组分解嵌入式 SQL 使用步伐来与 DB2 数据库停止交互。清单 6 给出了一个用 C 编程语言编写的运用静态 SQL 的俭朴嵌入式 SQL 使用步伐,它获得并输出使命头衔为 “DESIGNER” 的十足雇员的雇员标识号、姓和薪水。

清单 6. 运用静态 SQL 的俭朴嵌入式 SQL 使用步伐

                     #include <stdio.h>#include <string.h>#include <sql.h>int main(){// Include The SQLCA Data Structure VariableEXEC SQL INCLUDE SQLCA;// Define The SQL Host Variables NeededEXEC SQL BEGIN DECLARE SECTION;char     EmployeeNo[7];char     LastName[16];double   Salary;short    SalaryNI;EXEC SQL END DECLARE SECTION;// Connect To The Appropriate DatabaseEXEC SQL CONNECT TO sample USER db2admin USING ibmdb2;// Declare A Static CursorEXEC SQL DECLARE cursor1 CURSOR FORSELECT empno,lastname,DOUBLE(salary)FROM employeeWHERE JOB = 'DESIGNER';// Open The CursorEXEC SQL OPEN cursor1;// If The Cursor Was Opened Successfully, Retrieve And// Display All Records Availablewhile (sqlca.sqlcode == SQL_RC_OK){// Retrieve The Current Record From The CursorEXEC SQL FETCH cursor1INTO :EmployeeNo,:LastName,:Salary :SalaryNI;// Display The Record Retrievedif (sqlca.sqlcode == SQL_RC_OK) { printf("%-8s %-16s ", EmployeeNo,LastName);if (SalaryNI >= 0)  printf("%lf\n", Salary); elseprintf("Unknown\n"); }}// Close The Open CursorEXEC SQL CLOSE cursor1;// Commit The TransactionEXEC SQL COMMIT;// Terminate The Database ConnectionEXEC SQL CONNECT RESET;// Return Control To The Operating Systemreturn(0);}    

清单 7 给出了一个用 C 编程语言编写的运用静态 SQL 的俭朴嵌入式 SQL 使用步伐,它将使命头衔为 “DESIGNER” 的十足职员的使命头衔改为 “MANAGER”。

清单 7. 运用静态 SQL 的俭朴嵌入式 SQL 使用步伐

#include <stdio.h>
#include <string.h>
#include <sql.h>
int main()
{// Include The SQLCA Data Structure VariableEXEC SQL INCLUDE SQLCA;// Define The SQL Host Variables NeededEXEC SQL BEGIN DECLARE SECTION;char     DataSource[129] = {"SAMPLE"};char     UserID[129] = {"USER1"};char     Password[129] = {"User1PWD"};char     SQLStmt[80];char     JobType[10];EXEC SQL END DECLARE SECTION;// Connect To The Appropriate DatabaseEXEC SQL CONNECT TO :DataSource USER :UserID USING :Password;// Define A Dynamic UPDATE SQL Statement That Uses A// Parameter Markerstrcpy(SQLStmt, "UPDATE employee SET JOB = ? ");strcat(SQLStmt, "WHERE job = 'DESIGNER'");// Populate The Host Variable That Will Be Used In// Place Of The Parameter Markerstrcpy(JobType, "MANAGER");// Prepare The SQL StatementEXEC SQL PREPARE SQL_STMT FROM :SQLStmt;// Execute The SQL StatementEXEC SQL EXECUTE SQL_STMT USING :JobType;// Commit The TransactionEXEC SQL COMMIT;// Terminate The Database ConnectionEXEC SQL DISCONNECT CURRENT;// return Control To The Operating Systemreturn(0);
}

版权声明: 原创作品,应允转载,转载时请务必以超链接编制标明文章 原始来由 、作者信息和本声明。否则将究查执法责任。

转载于:https://www.cnblogs.com/zgqjymx/archive/2011/03/06/1972850.html

DB2 9 使用拓荒(733 检验)认证指南,第 4 部分: 嵌入式 SQL 编程(3)相关推荐

  1. DB2 9 运用开拓(733 测验)认证指南,第 4 部门: 嵌入式 SQL 编程(4)

    构建与 DB2 休止交互的运用程序 诊断和错误措置惩罚 利用 WHENEVER 语句 在后面,我们体会到 SQLCA 数据结构包孕每当执行 SQL 语句时由 DB2 Database Manager ...

  2. DB2 9 利用启示(733 测验)认证指南,第 7 部分: Java 编程(5)

    用 SQLJ 读取和更新数据 概述 SQLJ API 是 JDBC 的一个扩展,它支持 SQL 语句的静态实行.由于 DB2 支持 SQLJ,以是 Java 启示人员可以战胜 JDBC 的首要限制,即 ...

  3. DB2 9 利用开辟(733 测验)认证指南,第 1 部分: 数据库工具与编程步调(6)

    运用基泉源基本理构建根本 完毕语 总结 本教程向您引见了 DB2 利用挨次开辟的根本常识.在中缀任何开辟变乱之前,必须熟习差别规范的数据库工具.在本教程中,引见了几种初级的数据库工具.别名.序列工具和 ...

  4. duration转为时间戳_Flink Table APIamp;SQL编程指南之时间属性(3)

    Flink总共有三种时间语义:Processing time(处理时间).Event time(事件时间)以及Ingestion time(摄入时间).关于这些时间语义的具体解释,可以参考另一篇文章F ...

  5. DB2数据库嵌入式SQL开发

    如有转载,请注明出处:http://blog.csdn.net/embedded_sky BY:super_bert@csdn 1.1 DB2应用程序开发概述 1.1.1    程序结构 DB2应用程 ...

  6. DB2 9 使用开辟(733 检验)认证指南,第 2 部分: DB2 数据操作(1)

    学习根基不美概念 级别: 中级 Sunil Sabat, 技术同盟司理, PeopleSoft 在本教程中,您将学习 DB2 数据库中数据操作的根基不美概念.这是分 9 部分的系列教程的第 2 部分, ...

  7. DB2 9 使用拓荒(733 检讨)认证指南,第 2 部分: DB2 数据操作(6)

    学习根柢根底观观点 操作游标 游标措置概述 在本节中,您将更进一步看到若安在嵌入式 SQL 使用次第中运用游标.异常,根柢根底的步骤照旧是声明.翻开.获取.更新/删除(可选)和封闭. 为了赞助看法游标 ...

  8. DB2 9 运用开发(733 测验)认证指南,第 1 部分: 数据库工具与编程办法(1)

    操纵基本道理构建基本 级别: 低级 Clara Liu (claraliu@ca.ibm.com), DB2 产品操持人员, IBM 本文将介绍不同范例榜样的数据库工具及编程办法.这是包罗九篇教程的系 ...

  9. OCM exam guide - OCM认证指南

    OCM exam guide - OCM认证指南 from http://www.itpub.net/thread-1044550-1-1.html 今天开始在OU参加为期四天的Oracle 10g ...

最新文章

  1. 火爆 GitHub!这个图像分割神器究竟有什么魅力?
  2. Spark RDD概念学习系列之rdd持久化、广播、累加器(十八)
  3. 如何通过一个类名找到它属于哪个jar包?
  4. js判断是由含有a节点_怎么判断某个dom节点是否包含某个dom节点?
  5. 标签体系、用户分群、用户画像「玩味」解读,你沦为形式主义了吗?
  6. 在虚拟机中的Ubuntu搭建java开发环境
  7. Android笔记-对称与非对称加密及DH密钥交换
  8. 疑似华为P30系列售价曝光:欧洲售价最高8400元
  9. ACL in 和 out
  10. 对象的引用传递 ——面向对象3
  11. SQL Server 导入Excel数据
  12. 使用 json.tool 格式化 JSON字符串
  13. Matlab读取显示图像顺序
  14. WinRAR 5.71 官方简体中文无广告弹窗版本
  15. MAML-CNN代码笔记
  16. RRU、BBU、AAU
  17. 国美易卡的标识符和关键字是什么(国美易卡)
  18. guzzle php,PHP HTTP 客户端 - Guzzle
  19. matlab regress RMSE,在利用regress进行多元线性回归中出现的问题
  20. 红帽rhce考试自带补考吗_【重要通知】红帽 RHCE7.0 版本考试即将下线

热门文章

  1. 计算机硬盘的报废处理,看看电脑大神怎么直接把电脑干“报废”的!
  2. 【主成分分析】PCA降维算法及Matlab代码实现
  3. 从学龄前开始解读FFMPEG代码 之 AVDictionary结构体以及av_dict_set()相关函数
  4. 【推荐】写给想爱,正在爱,失去爱的人
  5. 100%代码覆盖率神话
  6. 【Bootstrap学习笔记】12.轮播插件
  7. 低版本浏览器兼容处理
  8. QT 静态库和动态库的使用方法
  9. 乌镇大会前两天,互联网大佬演讲干货汇总
  10. win10电脑进行疑难解答时出错如何处理?