DB2 SQLJ 存储过程开发宝典,第 2 部分_217_IT168文库

合集下载

DB2 SQLJ 存储过程开发宝典,第 1 部分_216_IT168文库

DB2 SQLJ 存储过程开发宝典,第 1 部分_216_IT168文库

DB2 SQLJ 存储过程开发宝典,第1 部分简介: SQLJ 存储过程开发宝典将分为 2 个部分。

本文是第 1 部分,在介绍SQLJ 的基础知识的基础上,结合实例,详细介绍如何一步步开发SQLJ 存储过程以及常用的调试方法。

在第2 部分中,我们将集中介绍开发SQLJ 存储过程的常见问题及其解决方法。

SQLJ 的基础知识1. 基本概念SQLJ 是 Java 应用程序与数据库进行数据传递的一种方式,它是将静态 SQL 语句嵌入在 Java 代码中的一种非过程语言。

SQLJ 为标准的 Java 程序提供了一种访问数据库的扩展能力,程序员只需要在 Java 代码中添加以特定符号标记的SQL 语句,Java 程序就可以从数据库获取数据,插入、更新或删除数据库中的数据。

不过,我们把这种嵌入了 SQL 语句的 Java 代码为 SQLJ 源代码。

下面是一段简单的 SQLJ 代码示例,我们可以一睹 SQLJ 代码的“芳容”。

清单1. SQLJ 代码片段示例try{// Retrieve Info from database tableString hostVar = null;#sql[ctx]{SELECT col INTO :hostvar FROM tablename WHERE objID=:objectID};} catch(SQLException e){logf("Error: Cannot execute SQL statement.");e.printStackTrace();}回到 SQLJ 技术本身,它是由 IBM、Oracle 和 Sybase 等数据库厂商于 1997 年提出的技术规范,确定了如何在 Java 变成语言中使用静态 SQL 语句。

同年 12 月,Oracle 提供了 SQL 嵌入于 Java 代码中的参考实现,该参考实现可以运行在任何支持 JDK1.1 的平台。

db2 .sql 示例 和编译

db2 .sql 示例 和编译

DB2是一种关系数据库管理系统(RDBMS),SQL是其查询语言。

在本文中,我们将介绍DB2中的一些SQL示例,并讨论编译这些示例的过程。

SQL示例:1.创建表创建表是数据库设计的基本步骤之一。

在DB2中,使用CREATE TABLE语句可以创建表。

我们可以创建一个名为“employees”的表,包含id、name和salary三个字段:```sqlCREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(50),salary DECIMAL(10, 2));```2.插入数据一旦我们创建了表,接下来就可以插入数据了。

使用INSERT INTO语句可以向表中插入数据。

我们可以向上面创建的“employees”表中插入一条记录:```sqlINSERT INTO employees (id, name, salary)VALUES (1, 'John Doe', 0.00);```3.查询数据查询是SQL的核心功能之一。

在DB2中,使用SELECT语句可以从表中检索数据。

我们可以查询“employees”表中所有员工的信息:```sqlSELECT * FROM employees;```4.更新数据有时候,我们需要更新表中的数据。

使用UPDATE语句可以实现这一功能。

我们可以将“employees”表中id为1的员工的薪水调整为0.00:```sqlUPDATE employeesSET salary = 0.00WHERE id = 1;```5.删除数据如果某条记录不再需要,我们可以使用DELETE语句将其从表中删除。

我们可以删除“employees”表中id为1的员工记录:```sqlDELETE FROM employeesWHERE id = 1;```编译SQL示例:在DB2中,编写的SQL语句需要经过编译才能执行。

db2存储过程

db2存储过程
OWNER_CUST_ID NUMBER(12),
USE_CUST_ID NUMBER(12),
ADDRESS_ID NUMBER(12),
COMMON_REGION_ID NUMBER(12),
BASIC_STATE VARCHAR2(10),
EXT_STATE VARCHAR2(3),
VOICE_AOC_TYPE CHAR(3),
DATA_AOC_TYPE CHAR,
ISMP_AOC_TYPE CHAR,
STOP_RENT_DATE DATE,
USE_LATN_ID NUMBER(9),
PAY_LATN_ID NUMBER(9)
)
insert into PROD_INST_919
(
CONTRACT_ID NUMBER(12),
ACCT_ID NUMBER(12),
INSTALL_DATE DATE,
ADDRESS_DESC VARCHAR2(250),
LAST_ORDER_ID NUMBER(12),
PHYSICAL_NBR VARCHAR2(20),
INSTALL_ADDR VARCHAR2(250),
EXT_PROD_INST_ID VARCHAR2(30),
BEGIN_RENT_DATE DATE,
tn_id LATN_ID --本地网标识
from
CIMM.V_USER_INFO_day a
left join det.ofr_prd_inst_main b on a.prd_inst_id=b.prd_inst_id
left join LCUST.SERV_ACCT c on b.serv_id=c.serv_id

db2数据库sql语句

db2数据库sql语句

db2数据库sql语句【实用版】目录1.DB2 数据库简介2.SQL 语句的作用和基本结构3.DB2 数据库中的 SQL 语句示例4.总结正文1.DB2 数据库简介DB2 是一种关系型数据库管理系统,由 IBM 公司开发。

它可以在各种平台上运行,如 Windows、Linux、Unix 等,支持多种编程语言,如 C、C++、Java、COBOL 等。

DB2 以其高性能、安全性和可扩展性而广泛应用于企业级数据管理。

2.SQL 语句的作用和基本结构SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的编程语言。

它可以用于查询、插入、更新和删除数据库中的数据,还可以用于创建和管理数据库表、视图等。

SQL 语句的基本结构包括:SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)、CREATE(创建)、DROP(删除)等。

3.DB2 数据库中的 SQL 语句示例以下是一些 DB2 数据库中常用的 SQL 语句示例:(1)查询数据```sqlSELECT * FROM table_name;(2)插入数据```sqlINSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);```(3)更新数据```sqlUPDATE table_name SET column1=value1, column2=value2 WHERE condition;```(4)删除数据```sqlDELETE FROM table_name WHERE condition;```(5)创建表```sqlCREATE TABLE table_name (column1 data_type1,column2 data_type2,column3 data_type3,...);(6)删除表```sqlDROP TABLE table_name;```4.总结DB2 数据库是一种广泛应用于企业级数据管理的关系型数据库管理系统。

DB2存储过程(Merge关键字的使用)

DB2存储过程(Merge关键字的使用)

DB2存储过程(Merge关键字的使用)CREATE PROCEDURE COPY_OCJ_LIST_TO_SHIPMENT(IN P_SESSION_ID VARCHAR(40), --当前用户的session ID IN P_IS_REPEAT VARCHAR(20), --如果导入新数据传入值:YES,如果导入全部数据传入值:ALLIN P_IS_SAME VARCHAR(20), --是否保存IN P_ORDER_TYPE VARCHAR(20), --客户发货入库IN P_ORDER_ID VARCHAR(20), --入库编号IN P_ORDER_TIME VARCHAR(30), --入库时间IN P_VENDOR_ID VARCHAR(20), --发货客户IN P_WAREHOUSE_ID VARCHAR(20),--分拨中心IN P_CREATE_BY VARCHAR(20) --创建者)MODIFIES SQL DATA --表示存储过程可以执行任何 SQL 语句LANGUAGE SQL-------------------------------------------------------------------------- SQL 存储过程------------------------------------------------------------------------P1: BEGIN ATOMIC--声明一个变量,用来保存入库计划明细中未失效运单的数量DECLARE D_ODRER_COUNT INTEGER;DECLARE D_ORDER_ID VARCHAR(20);--------------------------- 保存OCJ正式表数据 ---------------------------MERGE INTO OCJ_SHIPMENT OSUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心IS_CHECK, --是否审核CAR_LICENSE_NO, --车辆牌号DRIVER_NAME, --司机名称STATE, --状态CREATE_BY, --创建者CREATE_DATE, --创建日期LAST_UPDATE_BY, --修改者LAST_UPDATE_DATE, --修改日期SESSION_ID, --用户IDSERIAL_ID, --序列号IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT != P_IS_REPEAT)OSTON(OST.IS_REPEAT != P_IS_REPEAT ANDOS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDOS.VENDOR_ID=OST.VENDOR_ID) --如果临时表中标记为YS_Yes的,则修改WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETOS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO, --运单号OS.RECEIVE_DATE=OST.RECEIVE_DATE, --提货日期OS.VENDOR_ID=OST.VENDOR_ID, --发货客户OS.WAREHOUSE_ID =OST.WAREHOUSE_ID, --原分拨中心OS.FROM_WAREHOUSE_ID=OST.FROM_WAREHOUSE_ID, --来源分拨中心OS.IS_CHECK=OST.IS_CHECK, --是否审核OS.CAR_LICENSE_NO=OST.CAR_LICENSE_NO, --车辆编号OS.DRIVER_NAME=OST.DRIVER_NAME, --司机名称OS.STATE=OST.STATE, --状态ST_UPDATE_BY=ST_UPDATE_BY, --修改者ST_UPDATE_DATE=ST_UPDATE_DATE --修改日期WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(SHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心 IS_CHECK, --是否审核CAR_LICENSE_NO, --车辆牌号DRIVER_NAME, --司机名称STATE, --状态CREATE_BY, --创建者CREATE_DATE, --创建日期LAST_UPDATE_BY, --修改者LAST_UPDATE_DATE, --修改日期FROM_WAREHOUSE_ID --来源分拨中心 )VALUES(OST.SHIPMENT_ID,OST.SHIPMENT_PLAN_NO,OST.RECEIVE_DATE,OST.VENDOR_ID,OST.WAREHOUSE_ID,OST.IS_CHECK,OST.CAR_LICENSE_NO,OST.DRIVER_NAME,OST.STATE,OST.CREATE_BY,OST.CREATE_DATE,ST_UPDATE_BY,ST_UPDATE_DATE,OST.FROM_WAREHOUSE_ID);-------------------------------- 保存导入数据状态表状态 --------------------------------MERGE INTO SHIPMENT_STATE SSUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期--SESSION_ID, --用户ID--SERIAL_ID, --序列号IS_REPEAT --是否重复--FROM_WAREHOUSE_ID, --来源分拨中心--IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT != P_IS_REPEAT)OSTON(OST.IS_REPEAT != P_IS_REPEAT ANDSS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDSS.VENDOR_ID=OST.VENDOR_ID) --如果临时表中标记为YS_Yes的,则修改WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETSS.RECEIVE_DATE=OST.RECEIVE_DATE --提货日期WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(SHIPMENT_STATE_ID, --状态表ID(唯一的) SHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID --原分拨中心--CREATE_BY, --创建者--CREATE_DATE --创建日期)VALUES('SS' || OST.SHIPMENT_ID,OST.SHIPMENT_PLAN_NO,OST.RECEIVE_DATE,OST.VENDOR_ID,OST.WAREHOUSE_ID--OST.CREATE_BY, --创建者--OST.CREATE_DATE --创建日期);------------------------------------- 保存导入数据Other状态表状态 -------------------------------------MERGE INTO SHIPMENT_OTHER_STATE SOSUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户--WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT !=P_IS_REPEAT)OSTON(OST.IS_REPEAT != P_IS_REPEAT ANDSOS.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDSOS.VENDOR_ID=OST.VENDOR_ID) --如果临时表中标记为YS_Yes的,则修改WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETSOS.PLAN_WAREHOUSE_ID=OST.FROM_WAREHOUSE_ID, --来源分拨中心SOS.PLAN_IMPORT='YS_Yes', --可导入SOS.OCJ_IMPORT='YS_Yes', --可导入SOS.OCJ_CHECK='YS_Yes', --可审核SOS.INCOME_ORDER='YS_Yes', --可入库SOS.BOOK_LOC='YS_Yes' --可预排库位ST_UPDATE_BY=ST_UPDATE_BY, --修改者ST_UPDATE_DATE=ST_UPDATE_DATE --修改日期WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(SHIPMENT_STATE_ID, --状态表ID(唯一的) SHIPMENT_PLAN_NO, --运单号VENDOR_ID, --发货客户PLAN_WAREHOUSE_ID, --来源分拨中心PLAN_IMPORT, --可导入OCJ_IMPORT, --可导入OCJ_CHECK, --可审核INCOME_ORDER, --可入库BOOK_LOC --可预排库位--CREATE_BY, --创建者--CREATE_DATE --创建日期)VALUES('SOS' || OST.SHIPMENT_ID,OST.SHIPMENT_PLAN_NO,OST.VENDOR_ID,OST.FROM_WAREHOUSE_ID,'YS_Yes','YS_Yes','YS_Yes','YS_Yes','YS_Yes'--OST.CREATE_BY, --创建者--OST.CREATE_DATE --创建日期);---------------------------- 保存计划入库头信息 ----------------------------INSERT INTO WMS_INCOMING_ORDER_PLAN (ORDER_ID, --入库计划ID ORDER_NO, --入库计划单号ORDER_TIME, --入库时间ORDER_TYPE, --类型ENTER_TYPE, --自动STATE, --状态CREATE_BY, --创建者CREATE_DATE, --创建时间WAREHOUSE_ID, --分拨中心VENDOR_ID --发货客户)VALUES(P_ORDER_ID,'JHRKD' || P_ORDER_ID,P_ORDER_TIME,P_ORDER_TYPE,'AUTO','State_All_Y',P_CREATE_BY,P_ORDER_TIME,P_WAREHOUSE_ID,P_VENDOR_ID);------------------------------ 修改计划入库明细信息 ------------------------------MERGE INTO WMS_INCOMING_ORDER_ITEM_PLAN WIOIUSING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT !=P_IS_REPEAT AND IS_SAME_WAREHOUSE='YS_No' --查询当前用户下不同分拨中心的运单信息)OSTON(1=1 AND OST.IS_SAME_WAREHOUSE = 'YS_No' AND WIOI.SHIPMENT_PLAN_NO=OST.SHIPMENT_PLAN_NO ANDWIOI.VENDOR_ID=OST.VENDOR_ID --指定条件)WHEN MATCHED THEN--如果指定的条件匹配,则执行修改动作UPDATE SETSTATE = 'State_All_N';------------------------------ 保存计划入库明细信息 ------------------------------MERGE INTO WMS_INCOMING_ORDER_ITEM_PLAN WIOI USING(--查询OCJ导入的临时表数据SELECTSHIPMENT_ID, --IDSHIPMENT_PLAN_NO, --运单号RECEIVE_DATE, --提货日期VENDOR_ID, --发货客户WAREHOUSE_ID, --原分拨中心--IS_CHECK, --是否审核--CAR_LICENSE_NO, --车辆牌号--DRIVER_NAME, --司机名称--STATE, --状态--CREATE_BY, --创建者--CREATE_DATE, --创建日期--LAST_UPDATE_BY, --修改者--LAST_UPDATE_DATE, --修改日期IS_REPEAT, --是否重复FROM_WAREHOUSE_ID, --来源分拨中心IS_SAME_WAREHOUSE --是否同一分拨中心 FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT != P_IS_REPEAT AND IS_SAME_WAREHOUSE IS NOT NULL)OSTON(1 <> 1 --指定条件)WHEN NOT MATCHED THEN--如果指定的条件不匹配,则执行添加动作INSERT(ORDER_ITEM_ID, --明细IDORDER_ID, --头信息IDSHIPMENT_PLAN_ID, --配送计划IDSHIPMENT_PLAN_NO, --运单号CHECK_STATE, --VENDOR_ID, --发货客户WAREHOUSE_ID, --分拨中心LOC_ID, --库位IDQUANTITY, --数量STATE, --状态CREATE_BY, --创建者CREATE_DATE --创建日期)VALUES('WOIO' || SHIPMENT_ID,P_ORDER_ID,'-',OST.SHIPMENT_PLAN_NO,'YS_No',OST.VENDOR_ID,OST.WAREHOUSE_ID,'-',1,'State_All_Y',P_CREATE_BY,P_ORDER_TIME);------------------------- 修改计划入库信息 ---------------------------如果在入库计划明细中当前ORDER_ID下,不存在状态为State_All_Y,则更新头部信息为State_All_N--查询入库计划表表中有效运单的数据,根据ORDER_ID分组,如果该ORDER_ID下没有有效的入库计划明细,则头部信息失效FOR V ASSELECT count(*) AS count,WIOIP.order_id FROMWMS_INCOMING_ORDER_ITEM_PLAN WIOIPWHERE 1 = 1 AND WIOIP.STATE = 'State_All_Y' --状态为有效的GROUP BY WIOIP.order_id --根据ORDER_ID分组FOR READ ONLYDOSET D_ORDER_ID = V.order_id;SET D_ODRER_COUNT = V.COUNT;--如果有效运单为0,更新头部信息为失效IF D_ODRER_COUNT = 0 THENUPDATE WMS_INCOMING_ORDER_PLAN SET STATE ='State_All_N' WHERE ORDER_ID = D_ORDER_ID;END IF;END FOR;---------------------------------- 添加操作历史初始导入记录 ----------------------------------INSERT INTO ACTION_HISTORY (HISTORY_ID --操作历史ID, REFRENCE_ID --引用ID, REFRENCE_TYPE --操作类型, REFRENCE_OPERATOR --, WAREHOUSE_ID --分拨中心, SUB_WAREHOUSE_ID --, LOC_ID --库位, BEGIN_TIME --开始时间, STATE --状态, COMMENTS --备注, CREATE_BY --创建者, CREATE_DATE --创建时间, LAST_UPDATE_BY --最后修改者, LAST_UPDATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, SHIPMENT_PLAN_ID --配送计划ID , VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号)SELECT 'AHO' || SHIPMENT_ID --操作历史ID, SHIPMENT_ID --引用ID, 'OPERATOR_SHIPMENT_OCJ_IMPORT' --操作类型, 'NEW_OCJ_IMPORT' --, FROM_WAREHOUSE_ID --, '-' --库位, CREATE_DATE --开始时间, 'State_All_Y' --状态, '' --备注, CREATE_BY --创建者, CREATE_DATE --创建时间, CREATE_BY --最后修改者, CREATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, '-' --配送计划ID, VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT = 'YS_No';--初始导入---------------------------------- 添加操作历史覆盖导入记录 ----------------------------------INSERT INTO ACTION_HISTORY(HISTORY_ID --操作历史ID, REFRENCE_ID --引用ID , REFRENCE_TYPE --操作类型, REFRENCE_OPERATOR --, WAREHOUSE_ID --分拨中心, LOC_ID --库位 , BEGIN_TIME --开始时间, STATE --状态 , COMMENTS --备注 , CREATE_BY --创建者 , CREATE_DATE --创建时间, LAST_UPDATE_BY --最后修改者, LAST_UPDATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, SHIPMENT_PLAN_ID --配送计划ID, VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号 )SELECT 'AHO' || SHIPMENT_ID --操作历史ID, SHIPMENT_ID --引用ID, 'OPERATOR_SHIPMENT_OCJ_IMPORT' --操作类型, 'AGAIN_OCJ_IMPORT' --, WAREHOUSE_ID --分拨中心, FROM_WAREHOUSE_ID --, '-' --库位, CREATE_DATE --开始时间, 'State_All_Y' --状态, '' --备注, CREATE_BY --创建者, CREATE_DATE --创建时间, CREATE_BY --最后修改者, CREATE_DATE --最后修改时间, DRIVER_NAME --司机名称, CAR_LICENSE_NO --车辆编号, '-' --配送计划ID, VENDOR_ID --发货客户, SHIPMENT_PLAN_NO --运单号FROM OCJ_SHIPMENT_TEMPWHERE SESSION_ID = P_SESSION_ID AND IS_REPEAT = 'YS_Yes';--覆盖导入END P1本文来自CSDN博客,转载请标明出处:/soft_luo/archive/2009/12/01/4915477.aspx。

db2存储过程写法

db2存储过程写法

DB2是一种关系型数据库管理系统,支持使用存储过程进行数据处理和业务逻辑的封装。

下面是一个简单的DB2存储过程的写法示例:```sqlCREATE OR REPLACE PROCEDURE sp_example(IN param1 INT, OUT param2 VARCHAR(50))LANGUAGE SQLBEGIN-- 存储过程逻辑代码DECLARE var1 INT;SET var1 = param1 + 10;-- 查询数据SELECT column_name INTO param2FROM table_nameWHERE condition;-- 更新数据UPDATE table_nameSET column_name = var1WHERE condition;-- 返回结果SET param2 = 'Success';END@```上述示例定义了一个名为`sp_example`的存储过程,接受一个输入参数`param1`(整型)和一个输出参数`param2`(字符型)。

在存储过程中,可以编写逻辑代码来处理数据,包括声明变量、查询数据、更新数据等操作。

需要注意几点:- `LANGUAGE SQL`指定了存储过程使用的语言为SQL。

- `DECLARE`关键字用于声明局部变量,这里的`var1`是一个整型变量。

- 使用`SELECT INTO`语句将查询结果赋值给输出参数`param2`。

- 使用`UPDATE`语句更新表中的数据。

- 最后,使用`SET`语句将结果赋给输出参数`param2`。

最后,`END@`表示存储过程的结束。

请注意,这只是一个简单示例,实际的存储过程可能会更加复杂,根据具体需求来设计和实现存储过程的逻辑。

DB2实验报告5(存储过程与函数)(1)(1)

DB2实验报告5(存储过程与函数)(1)(1)

DB2实验报告5(存储过程与函数)(1)(1)
1. 实验目的
本实验旨在通过研究和实践,了解DB2数据库的存储过程与函数的基本概念、使用方法和应用场景。

2. 实验内容
本实验将包括以下几个部分的研究和实践:
- 研究存储过程与函数的概念和特点
- 研究存储过程与函数的语法和使用方法
- 实践创建和执行存储过程与函数
- 探索存储过程与函数在实际应用中的场景和优势
3. 实验步骤
3.1 研究存储过程与函数的概念和特点
通过阅读相关文献和理解教材中的内容,研究存储过程与函数在数据库中的定义、作用和特点。

3.2 研究存储过程与函数的语法和使用方法
通过参考官方文档和教材,了解存储过程与函数的语法结构和使用方法。

3.3 实践创建和执行存储过程与函数
在DB2数据库中,使用合适的SQL语句和语法,创建并测试一些简单的存储过程和函数。

3.4 探索存储过程与函数在实际应用中的场景和优势
通过分析和讨论,了解存储过程和函数在实际应用中的常见场景、优势和限制。

4. 实验总结
总结本次实验的研究收获和体会,以及存储过程与函数在DB2数据库中的应用前景和挑战。

5. 参考文献
列出用于本次实验的参考文献,包括书籍、官方文档和网络资源。

以上为DB2实验报告5(存储过程与函数)(1)(1)的框架,具体内容请根据实际情况进行书写和补充。

DB2存储过程

DB2存储过程

--CURSOR---------->
>--FOR--+-select-statement
-+-------------><
.-WITHOUT HOLD-.
|--+--------------+---------------------------------------------|
DB2 支持以下创建数组数据类型的语法:
清单 2. 创建数组数据类型的语法
Sql代码
>>-CREATE TYPE—array-type-name--AS--| data-type |--ARRAY--[---------->
.-2147483647-------.
若要更改默认函数路径,则需要更新专用寄存器 CURRENT PATH。
游标
声明
SQL PL 提供 DECLARE cursor 语句来定义一个游标,并提供其他语句来支持返回其他结果集和游标处理。
下面是游标声明的语法: Leabharlann 清单 7. 游标声明的语法
>>-DECLARE--cursor-name
现在可以在 SQL 过程中使用这个数据类型:
清单 3. 在过程中使用数组数据类型
Sql代码
CREATE PROCEDURE PROC_VARRAY_test (out mynames names)
BEGIN
DECLARE v_pnumb numbers;
'-WITH HOLD----'
.-WITHOUT RETURN-------------.
|--+----------------------------+-------------------------------|

DB2 SQLJ 存储过程开发宝典,第 2 部分_217_IT168文库

DB2 SQLJ 存储过程开发宝典,第 2 部分_217_IT168文库

DB2 SQLJ 存储过程开发宝典,第 2 部分简介: 在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。

现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。

此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。

引言在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。

现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。

此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。

常见错误总结由于程序代码本身、运行环境、参数配置等原因,SQLJ 存储过程在被调用时,可能会发生各种错误。

对这些错误进行分析,明确其产生的原因,找到相应的应对措施,并加以归纳总结,对我们提高开发水平、保证产品质量和提高工作效率等方面具有重要的意义。

这些信息对于 SQLJ 应用开发的初学者尤为重要,能够直接的帮助他们解决开发实际工作中遇到的问题,表 1 列出了常见的 SQLJ 存储过程运行错误,原因以及相应措施。

表 1. 常见错误错误原因措施SQL4306N Java 存储过程或用户定义的函数 名称(特定名称 特定名称)不能调用 Java 方法 方法,特征符为 字符串 DB2 通过 JAR 包名、类名、方法名和签名(Signature )无法找到创建存储过程时指定的被调用的方法。

可能是引用的类不存在、jar 包没有安装、方法声明的参数列表与数据库期望的参数列表不匹配或者不是“public”实例方法 1.查看 Java 代码中的方法名和类名,检查存储过程DDL 中 Java 方法名、类名和 jar 包名是否有误; 2.检查 jar/calss 文件是否在指定位置,如 sqllib/function 目录下; 3.检查存储过程 DDL 中的方法参数列表是否与 Java 代码匹配(使用 javap – s class_id 可以查看类中方法的签名),并且 Java 代码中该方法是 public的。

db2 存储过程 联邦 注意事项

db2 存储过程 联邦 注意事项

db2 存储过程联邦注意事项下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!DB2存储过程联邦注意事项在使用DB2数据库管理系统中,存储过程是一种经常用于执行一系列数据库操作的编程对象。

[训练]DB2存储过程编写规范

[训练]DB2存储过程编写规范

[训练]DB2存储过程编写规范DB2存储过程编写规范版本号:1.0修订记录:修订日期修订版本修订人修订内容 2007-03-01 1.0 潘冬梅制定DB2存储过程编写规范目录第一章.前言 (5)一.编写目的 (5)二.编写背景 (5)三.适用范围 (5)程序结构 (6)第二章.一.整体结构......................................................... 6 二.程序说明......................................................... 7 三.变量定义 (7)四.异常错误处理 (8)五.程序正文 (10)第三章.命名规范 .......................................................10 一.存储过程命名 (10)二.参数命名 (11)三.变量命名 (11)四.临时表命名 (12)第四章.书写格式 .......................................................12 一.表达范式 .......................................................12 二.段落缩进 .......................................................12.段落间隔 (13)三四.程序注释 .......................................................13 第五章.注意事项 (14)一.固定的输出参数 (14)二.临时表的使用 (14)三.数据的插入 (15)四.where 条件 (15)五.count 的使用 (15)六.全表删除 (15)七.MERGE,UPSERT, 的使用 (15)第六章.附录A............................................................16第一章.前言一.编写目的为了提高开发效率和程序的可读性~降低程序编写过程的出错率和重复劳动性~保持程序编写风格的一致性和连贯性~特定此规范。

db2 SQL 入门

db2  SQL 入门

SQL 入门结构化查询语言---SQL第 1 章关系数据库和 SQL关系数据库中,数据存储在表中。

表是行和列的集合SQL 是在关系数据库中定义和处理数据的标准化语言。

SQL 语句由数据库管理程序执行。

分区关系数据库是在多个分区(也称为节点)上管理数据的关系数据库。

第 2 章组织数据表是由确定的列数和可变的行数组成的逻辑结构。

列是一组数据类型相同的值。

行是组成表中单个记录的连续的值。

基表存放用户数据,且它是用CREATE TABLE 语句创建的。

结果表是一组行,数据库管理程序从一个或多个基表选择或生成这组行以满足查询要求。

图 1. 表的直观图视图提供了在一个或多个表中查看数据的替代方法。

它是表上的一个动态窗口。

使用视图的优点是您可以使用它们来控制对敏感数据的存取。

所以,不同的人可以存取数据的不同列或行。

模式是已命名的对象(如表和视图)的集合。

模式提供了数据库中对象的逻辑分类。

SYSIBM SYSCAT数据类型数据类型定义常数、列、宿主变量、函数、表达式以及专用寄存器可接受的值。

字符串定长字符串变长字符串图形字符串定长图形字符串变长图形字符串二进制字符串数字所有数字都有符号和精度。

精度是除符号位以外的位数或数字数。

SMALLINTINTEGERBIGINTREALDOUBLEDECIMAL(p,s)日期时间值日期时间值是日期、时间以及时间戳记(一个格式为yyyyxxddhhmmss的表示有效日期和时间的 14 位字符串)的表示法。

日期时间值可以用于某些算术运算和字符串运算并且与某些字符串是相容的,但是它们既非字符串也非数字。

1日期时间时间戳记时间戳记是指定日期和时间的值,分为七个部分(年、月、日、小时、分钟、秒以及微秒)。

空值可以使用此表作为正确数据类型用法的快速参考。

数据类型类型特性示例或范围CHAR(15) 定长字符串最大长度为254 'Sunny day 'V ARCHAR(15) 变长字符最大长度为32672 'Sunny day'SMALLINT 数字长度为 2 个字节精度为5 位范围为-32768 至32767INTEGER 数字长度为 4 个字节精度为10 位范围为-2147483648 至2147483647BIGINT 数字长度为8 个字节精度为19 位范围为-9223372036854775808 至9223372036854775807REAL 数字单精度浮点32 位近似值范围是-3.402E+38 至-1.175E-37,或 1.175E-37至-3.402E+38,或为0DOUBLE 数字双精度浮点64 位近似值范围是-1.79769E+308 至-2.225E-307 或 2.225E-307至1.79769E+308,或为0 DECIMAL(5,2) 数字精度是5 小数位是2 范围是-10**31+1 至10**31-1DATE 日期时间由三部分组成的值1991-10-27TIME 日期时间由三部分组成的值13.30.05TIMESTAMP 日期时间由七部分组成的值1991-10-27-13.30.05.000000 第 3 章创建表和视图本章包括:∙"创建表"和"创建视图"∙"插入数据"∙"更改数据"∙"删除数据"∙"使用视图来处理数据"创建表CREATE TABLE PERS( ID SMALLINT NOT NULL,NAME VARCHAR(9),DEPT SMALLINT WITH DEFAULT 10,JOB CHAR(5),YEARS SMALLINT,SALARY DECIMAL(7,2),COMM DECIMAL(7,2),BIRTH_DATE DATE)插入数据下列语句使用 VALUES 子句将数据插入 PERS 表中:INSERT INTO PERSVALUES (12, 'Harris', 20, 'Sales', 5, 18000, 1000, '1950-1-1')INSERT INTO PERS (NAME, JOB, ID)VALUES ('Swagerman', 'Prgmr', 500),('Limoges', 'Prgmr', 510),('Li', 'Prgmr', 520)下列语句返回插入的结果:SELECT *FROM PERSID NAME DEPT JOB YEARS SALARY COMM BIRTH_DATE ------ --------- ------ ----- ------ --------- --------- ---------- 12 Harris 20 Sales 5 18000.00 1000.00 01/01/1950 500 Swagerman 10 Prgmr - - - -510 Limoges 10 Prgmr - - - -520 Li 10 Prgmr - - - -下列示例从 STAFF 表中选择部门 38 的成员的数据,并将它插入 PERS 表中:INSERT INTO PERS (ID, NAME, DEPT, JOB, YEARS, SALARY)SELECT ID, NAME, DEPT, JOB, YEARS, SALARYFROM STAFFWHERE DEPT = 38在此插入之后,下列 SELECT 语句与 INSERT 语句中全查询产生的结果相同。

DB2存储过程快速入门.

DB2存储过程快速入门.

1.1 SQL过程的结构命名规则:1、清洗过程名称命名:PROC_业务主题_目标表(PROC_JY_KJYRLJB 交易主题的卡交易日类聚表)2、函数名称命名:PROC_业务主题_函数名(PROC_JY_GETYWZL 交易主题取得卡业务种类函数)3、变量命名:VAR_变量描述(VAR_YWZL 业务种类变量)4、游标命名:CUR_游标描述(CUR_KJYB 对卡交易表进行游标处理)语法:CREATE PROCEDURE 过程名称(参数列表DYNAMIC RESULT SETS 结果集数量是否允许SQLLANGUAGE SQLBEGINSQL 过程体END范例“资产负债.sql ”中第1行:Create Procedure admin.BalanceSheetDayly定义了过程名称参数列表为Out ProcState varchar(100其定义SQL 过程从客户应用获取,或返回客户应用的0个或多个参数,参数列表使用逗号侵害各个参数参数类型有三种:l IN 从客户应用检索值。

其不能够在SQL 过程体中修改l OUT 向客户应用返回值l INOUT 从客户应用检索值,并返回值省略了结果集数量的定义,default 为0。

即表示不返回结果集。

省略了是否允许SQL 的说明。

其值指出了存储过程是否会使用SQL 语句,如果使用,其类型如何:l NO SQL 不能够执行任何SQL 语句l COTAINS SQL 可以执行不会读取SQL 数据,也不会修改SQL 数据的SQL 语句l READS SQL DATA 可以包含不会修改SQL 数据的SQL 语句l MODIFIES SQL DATA 可以执行任何SQL 语句,除了不能够在存储过程中支持的语句以外。

第3~7行,为注释,标明此为SQL 过程,编写、最后修改时间。

注释为“--”开始的行。

第8行和最后一行199共同标识出SQL 过程体过程体存储过程的逻辑内容,包括变量声明、条件控制、流控制语句、以及通过SQL语句处理数据的过程。

DB2数据库SQL存储过程

DB2数据库SQL存储过程

DB2数据库SQL存储过程高性能的SQL过程是数据库开发人员所追求的,我将不断把学到的,或在实际开发中用到的一些提高SQL过程性能的技巧整理出来,温故而知新.1,在只使用一条语句即可做到时避免使用多条语句让我们从一个简单的编码技巧开始。

如下所示的单个 INSERT 行序列:INSERT INTO tab_comp VALUES (item1, price1, qty1);INSERT INTO tab_comp VALUES (item2, price2, qty2);INSERT INTO tab_comp VALUES (item3, price3, qty3);可以改写成:INSERT INTO tab_comp VALUES (item1, price1, qty1),(item2, price2, qty2),(item3, price3, qty3);执行这个多行 INSERT 语句所需时间大约是执行原来三条语句的三分之一。

孤立地看,这一改进看起来似乎是微乎其微的,但是,如果这一代码段是重复执行的(例如该代码段位于循环体或触发器体中),那么改进是非常显著的。

类似地,如下所示的 SET 语句序列:SET A = expr1;SET B = expr2;SET C = expr3;可以写成一条 VALUES 语句:VALUES expr1, expr2, expr3 INTO A, B, C;如果任何两条语句之间都没有相关性,那么这一转换保留了原始序列的语义。

为了说明这一点,请考虑:SET A = monthly_avg * 12;SET B = (A / 2) * correction_factor;将上面两条语句转换成:VALUES (monthly_avg * 12, (A / 2) * correction_factor) INTO A, B;不会保留原始的语义,因为是以“并行”方式对 INTO 关键字之前的表达式进行求值的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DB2 SQLJ 存储过程开发宝典,第 2 部分简介: 在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。

现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。

此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。

引言在第 1 部分,我们已经介绍了 SQLJ 存储过程的基本知识,如何逐步完成开发和调试。

现在,我们将总结说明在运行 SQLJ 存储过程时,经常遇到的错误,并对这些错误产生的原因进行分析,并给出相应的修正方法。

此外,在开发过程中,有一些值得考虑或者需要进一步说明的问题,我们也将他们罗列出来,予以探讨。

常见错误总结由于程序代码本身、运行环境、参数配置等原因,SQLJ 存储过程在被调用时,可能会发生各种错误。

对这些错误进行分析,明确其产生的原因,找到相应的应对措施,并加以归纳总结,对我们提高开发水平、保证产品质量和提高工作效率等方面具有重要的意义。

这些信息对于 SQLJ 应用开发的初学者尤为重要,能够直接的帮助他们解决开发实际工作中遇到的问题,表 1 列出了常见的 SQLJ 存储过程运行错误,原因以及相应措施。

表 1. 常见错误错误原因措施SQL4306N Java 存储过程或用户定义的函数 名称(特定名称 特定名称)不能调用 Java 方法 方法,特征符为 字符串 DB2 通过 JAR 包名、类名、方法名和签名(Signature )无法找到创建存储过程时指定的被调用的方法。

可能是引用的类不存在、jar 包没有安装、方法声明的参数列表与数据库期望的参数列表不匹配或者不是“public”实例方法 1.查看 Java 代码中的方法名和类名,检查存储过程DDL 中 Java 方法名、类名和 jar 包名是否有误; 2.检查 jar/calss 文件是否在指定位置,如 sqllib/function 目录下; 3.检查存储过程 DDL 中的方法参数列表是否与 Java 代码匹配(使用 javap – s class_id 可以查看类中方法的签名),并且 Java 代码中该方法是 public的。

SQL4304N Java 存储过程或用户定义的函数 名称(特定名称 特定名称)不能装入 Java 类 类,原因码为 原因码。

1. RC=1:在 CLASSPATH 上找不到该类。

往往可能是我们在DDL 发生了拼写错误;2. RC=2:该类未实现必需的接口 COM.ibm.db2.app.StoredProc或缺少 public 访问权标志。

如果是 PARAMETER STYLEDB2GENERAL 的存储过程,那么要求被调用 Java 类是 public的并继承了接口 COM.ibm.db2.app.StoredProc 。

1.检查 Java 代码中的类 / 方法名和存储过程 DDL中 Java 类 / 方法名是否一致;2.检查 jar/calss 文件是否在 CLASSPATH 中,如sqllib/function 目录下;3.检查是否 DDL 指定了 PARAMETER STYLEDB2GENERAL 而 Java 代码类是否是 public 并继承接口 COM.ibm.db2.app.StoredProc 。

SQL4302N过程或用户定义的函数 名称(特定名称 特定名称)由于异常 字符串 而存储过程由于异常而异常终止。

通常可能是查询返回是空的数据集,或是 SQL 中使用“select into :hostvar”但是实际查询返回多条数据,或 Java 运行中出现空指针异常等。

检查 db2diag.log 诊断日志,找到错误,修正 Java代码。

异常终止。

SQL4301NJava 或 .NET 解释器启动或通信失败,原因码为 原因码。

启动或与 JVM 通信时出错。

可能是因为 Java 环境变量或 Java 数据库配置参数无效,如 JDK_PATH 和 JAVA_HEAP_SZ 配置失当 或 db2java.zip 不在 CLASSPATH 中等。

确保正确设置了 Java 数据库配置参数(jdk_path 和 java_heap_sz )。

确保安装了支持的 Java 运行时环境。

确保内部 DB2 类(COM.ibm.db2)未被用户类覆盖。

1. 检查 jdk_path 是否指向 JDK 的 bin 目录的父目录,CLASSPATH 中包含 db2java.zip ;2. 检查是否指定了足够大的 java_heap_sz 。

SQL20204N 用户定义的函数或过程 函数名 无法映射至单个 Java 方法。

存储过程找不到匹配的 Java 方法,或者找到多个匹配的 Java 方法。

理解 EXTERNAL NAME 的规范格式 [jar_id]:class_id(.|!)method_id ,即“:”分隔包名和类名,“.”或“!”分隔类名和方法名,包名可选。

1.检查 DDL 是否指定了正确的 Java 方法名、类名和 jar 包名; 2.检查 jar/calss 文件是否存在,如在 sqllib/function目录下;3.检查是否有方法参数列表匹配问题。

SQL1042C 发生了意外的系统错误。

运行存储过程是出现该错误,往往是因为 DB2 实例级别的环境问题、访问权限问题或参数配置问题。

如 Java 程序访问无权访问的文件、DB2 参数 DB2_FMP_COMM_HEAPSZ 设置为零等。

检查 db2diag.log 诊断日志,找到系统错误的原因并予以修正。

如正确配置文件的访问权限,Java 代码中只读写可读写的文件等。

更详细的信息,请参考文章 解决 DB2 UDB Java 存储过程的常见问题。

进一步探讨的若干问题为了介绍的简明和连贯,在第 1 部分 SQLJ 存储过程的开发实例中,我们使用了比较简练的示例,分步骤说明如何完成 SQLJ 存储过程的编码和调试,没有展开篇幅,引入更多的讨论。

下面我们以问答的形式,介绍在 SQLJ 存储过程的开发中,我们需要知晓的一些其它问题。

1. 如果不把 SQLJ 概要文件绑定到特定的数据库,可以运行 SQLJ 存储过程吗?可以。

在 SQLJ 应用开发模型和 SQLJ 存储过程开发流程的介绍中,我们都介绍了需要将 SQLJ 概要文件定制到特定的数据库。

更进一步,在定制概要文件成功后,概要文件将被更新,增加定制信息,包括 DB2 package 名称和时间戳等内容。

在执行 SQLJ 应用时,如果发现概要文件中含有定制信息,那么将使用生成的 DB2 package ,运行静态 SQL ,反之,如果概要文件中没有定制信息,那么将按动态 SQL 完成数据库操作。

所以仅从 SQLJ 存储过程能否运行来说,概要文件定制这一步骤不是必需的。

跳过这一步,SQLJ 存储过程仍然可以运行,但是 DB2 概要文件中没有任何定制化信息,存储过程将退化为动态执行 SQL 的 Java 应用,与直接使用 JDBC 编写的 Java 存储过程一样,但是这显然不是我们使用 SQLJ 的目的,所以一般情况下,我们都需要定制 SQLJ 概要文件。

2. 可以在同一 Java 源文件中,同时使用 SQLJ 和 JDBC 吗?可以。

SQLJ 和 JDBC 可以共享数据库连接,SQLJ 可以从 JDBC 的连接(connection)为参数创建连接上下文(connection context),JDBC 也可以从 SQLJ 连接上下文中获得连接,这样,SQLJ 和 JDBC 在同一数据库连接,可以共享事务单元;SQLJ 和 JDBC 也可以相互传递从数据库中返回的查询结果,可以通过 SQLJ 的迭代器的 getResultSet() 方法,得到JDBC 的 ResultSet。

也可以通过 CAST 语句将 JDBC 的 ResultSet 转换为 SQLJ 的迭代器。

参见清单 1。

清单1. SQLJ 和JDBC 交互的示例??????????????????????????????????//...MyContext ctx = new MyContext("jdbc:default:connection", false);#sql [ctx] { INSERT INTO tableName (objId, col) VALUES (2, 'sales') };// 由 SQLJ 连接上下文获得 JDBC 连接Connection dbcon = ctx.getConnection();// 以 JDBC 连接为参数创建 SQLJ 连接上下文MyContext newCtx = new MyContext(dbcon);#sql [newCtx] { INSERT INTO tableName (objId, col) VALUES (3, 'orders') };//SQLJ 的迭代器传递数据给 JDBC 的 ResultSet#sql [newCtx] myCursor = { SELECT col FROM tableName };ResultSet rs = myCursor.getResultSet();while (rs.next()) {System.out.println(rs.getString(1));}//JDBC 的 ResultSet 传递数据给 SQLJ 的迭代器Statement stmt = dbcon.createStatemnt();ResultSet rs = stmt.executeQuery("SELECT col FROM tableName");#sql myCursor = { CAST :rs };while (myCursor.next()) {System.out.println(());3. 示例中所有 SQLJ 语句中都指定了连接上下文,它们可以省略吗?有关 SQLJ 上下文的使用,情况稍微有点复杂。

在本文前面的示例代码中,均使用了“#sql [ctx] { SQL statement};”格式嵌入 SQL 语句,但是如果我们使用的是 DB2 v8 之前的版本中,那么也可以省略 [ctx],即“sql { SQL statement};”,这时我们使用的是缺省的连接上下文,代码片段如清单 2 所示。

清单2. 在DB2 v8 之前的版本中使用缺省上下文?????????????????????????public class MyClass {public static void MyMethod(int objectID, String[] colName){//...try {DefaultContext ctx = DefaultContext.getDefaultContext();#sql { SELECT col into :hostVar FROM tableName WHERE objID=:objectID };//...} catch (SQLException e) {//Log error message}} // end of MyMethod} // end of MyClass正如在第 1 部分讨论连接上下文时所指出的,在新的 DB2 版本中,我们不能以清单 2 中的方法创建和使用缺省上下文,因为在多线程的环境下使用同一连接上下文,将可能导致不可预测的后果。

相关文档
最新文档