DB2 SQLJ 存储过程开发宝典,第 2 部分_217_IT168文库
db2 调用存储过程
db2 调用存储过程
摘要:
1.存储过程的定义与作用
2.DB2 数据库与存储过程的关系
3.DB2 调用存储过程的方法
4.调用存储过程的实例分析
5.存储过程的优点与使用注意事项
正文:
1.存储过程的定义与作用
存储过程是一组预编译的SQL 语句,用于执行特定的任务。它可以接受输入参数,返回结果集,还可以输出参数。存储过程在数据库中具有很高的性能,因为它们是预编译的,所以执行速度较快。此外,存储过程有助于实现数据安全性和保持数据一致性。
2.DB2 数据库与存储过程的关系
DB2 是一种关系型数据库管理系统,它支持存储过程的编写和调用。在DB2 中,存储过程可以用于执行复杂的业务逻辑、数据处理和数据操纵。通过使用存储过程,可以简化应用程序的开发和维护,提高系统的性能和安全性。
3.DB2 调用存储过程的方法
在DB2 中,可以通过以下几种方法调用存储过程:
(1)使用CALL 语句:CALL 语句是DB2 中调用存储过程的常用方法。它可以接受参数并将结果返回给调用者。例如:CALL usp_name
(param1, param2,...)。
(2)使用EXECUTE IMMEDIATE 语句:EXECUTE IMMEDIATE 语句用于执行一条SQL 语句。它可以用于调用存储过程,但需要将存储过程的定义文本作为参数传递。例如:EXECUTE IMMEDIATE "CALL usp_name (param1, param2,...)";。
(3)使用DB2 Command Line Processor:通过DB2 Command Line Processor,可以直接输入CALL 语句调用存储过程。例如:db2 -x "CALL usp_name (param1, param2,...)"。
DB2存储过程精简教程
DB2存储过程精简教程
DB2存储过程是一种在数据库服务器上执行的可重复使用的代码块,用于完成特定任务。它可以接受输入参数,并返回结果。存储过程有助于提高数据库性能和安全性。在这篇文章中,我们将介绍如何创建和使用DB2存储过程。
一、创建存储过程
要创建存储过程,您需要先登录到DB2数据库服务器。然后,使用CREATEPROCEDURE语句指定存储过程的名称、输入参数和返回结果。下面是一个示例:
CREATE PROCEDURE get_employee(IN employee_id INT, OUT employee_name VARCHAR(255))
BEGIN
SELECT name INTO employee_name FROM employees WHERE id = employee_id;
END
上面的代码创建了一个名为get_employee的存储过程。它接受一个输入参数employee_id,并通过输出参数employee_name返回相应的员工姓名。
二、执行存储过程
要执行存储过程,您可以使用CALL语句,如下所示:
CALL get_employee(1001, ?);
上面的代码将调用get_employee存储过程,并将1001作为输入参数传递。由于我们使用了输出参数,所以使用问号来表示它。调用语句将返回存储过程中定义的输出参数的值。
三、存储过程中的控制结构
存储过程可以包含各种控制结构,如条件语句和循环语句。下面是一个示例:
CREATE PROCEDURE calculate_salary(IN employee_id INT)
DB2常用sql语句
DB2常⽤sql语句
转
DB2 提供了关连式资料库的查询语⾔sql(structured query language),是⼀种⾮常⼝语化、既易学⼜易懂的语法。此⼀语⾔⼏乎是每个资料库系统都必须提供的,⽤以表⽰关连式的操作,包含了资料的定义(ddl)以及资料的处理(dml)。sql原来拼成sequel,这语⾔的原型以"系统 r"的名字在 ibm 圣荷西实验室完成,经过ibm内部及其他的许多使⽤性及效率测试,其结果相当令⼈满意,并决定在系统r 的技术基础发展出来 ibm 的产品。⽽且美国国家标准学会(ansi)及国际标准化组织(iso)在1987遵循⼀个⼏乎是以 ibm sql 为基础的标准关连式资料语⾔定义。
⼀、资料定义 DDL(data definition language)
资料定语⾔是指对资料的格式和形态下定义的语⾔,他是每个资料库要建⽴时候时⾸先要⾯对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。
1、建表格:
create table table_name(
column1 datatype [not null] [not null primary key],
column2 datatype [not null],
...)
说明:
datatype --是资料的格式,详见表。
nut null --可不可以允许资料有空的(尚未有资料填⼊)。
primary key --是本表的主键。
2、更改表格
alter table table_name
db2 存储过程 异常处理 实例
一、概述
DB2数据库是一种流行的关系型数据库管理系统,它支持存储过程的
使用。存储过程是一组预先编译的SQL语句,用于完成特定的任务。在存储过程中,经常会涉及到异常处理,以应对可能出现的错误情况。本文将以DB2存储过程异常处理为主题,结合实际案例,详细介绍在DB2数据库中如何进行存储过程异常处理。
二、DB2存储过程异常处理概述
1. 存储过程异常处理的重要性
在存储过程中,可能会发生各种异常情况,例如数据输入错误、数据
查询失败等。良好的异常处理机制可以保证存储过程的稳定性和可靠性,保障数据的完整性。
2. 异常处理的基本原则
异常处理的基本原则是捕获异常、处理异常、并作出相应的反应,以
确保存储过程能够正常执行或者给出相应的提示信息。
三、DB2存储过程异常处理实例
下面将介绍一个实际的DB2存储过程异常处理的案例,以便读者更好地理解异常处理的具体操作。
假设有一个名为“get_employee_info”的存储过程,用于获取员工
的信息。在该存储过程中,可能会涉及到以下异常情况:如果输入的
员工ID不存在,则需要给出相应的提示信息;如果查询员工信息失败,则需要进行异常处理。
在这种情况下,可以使用以下方法进行异常处理:
1. 使用BEGIN ATOMIC和DECLARE CONTINUE HANDLER语句
在存储过程的开头,使用BEGIN ATOMIC语句标识一个原子操作块,以确保事务的原子性。在该块内部,使用DECLARE CONTINUE HANDLER语句来捕获异常,并对异常进行相应的处理。
具体代码如下:
DB2存储过程基本语法
DB2存储过程基本语法
存储过程的基本语法如下:
1.创建存储过程:
```sql
CREATE PROCEDURE procedure_name [ (parameter_name parameter_data_type [, ...]) ]
BEGIN
-- SQL statements
END;
```
存储过程使用`CREATEPROCEDURE`语句来创建,指定存储过程的名称以及可选的参数。然后使用`BEGIN`和`END`之间的SQL语句来定义过程的操作。
2.存储过程参数:
存储过程可以接收参数,并且可以设置参数的初始值。
```sql
CREATE PROCEDURE procedure_name (IN parameter_name parameter_data_type [DEFAULT default_value])
BEGIN
-- SQL statements
END;
```
参数可以设置为输入(IN)参数或者输出(OUT)参数,用于接收过程内部的数据或者返回数据。
3.存储过程返回结果:
存储过程可以返回结果集或者只是执行一些操作而不返回结果。
```sql
CREATE PROCEDURE procedure_name
DYNAMIC RESULT SETS integer
BEGIN
-- SQL statements
END;
```
使用`DYNAMICRESULTSETS`关键字来指定结果集的数量。如果存储过程不返回结果集,可以省略这一行。
4.存储过程操作:
存储过程可以包含SQL语句,例如SELECT、INSERT、UPDATE和DELETE等操作。可以使用条件判断、循环等控制流语句来实现复杂的逻辑。
db2数据库教程
db2数据库教程
DB2数据库教程
DB2是一种关系型数据库管理系统(RDBMS),由IBM开发和维护。它是一种可靠稳定的数据库技术,被广泛应用于大型企业和机构中。本教程将为您介绍DB2数据库的基本概念、安装过程、SQL语言以及一些高级主题。
1. DB2数据库的概述
- DB2是IBM公司的一种关系型数据库管理系统(RDBMS)。 - 它支持在多个平台上运行,包括Windows、Linux和UNIX 等。
- DB2提供了高可用性、高可靠性和高性能的特性,以满足企业级应用的需求。
2. DB2的安装过程
- 在Windows平台上安装DB2数据库的过程非常简单。您只需要下载安装程序,然后按照安装向导的指导进行安装即可。 - 在Linux和UNIX平台上安装DB2略微复杂一些,需要一些命令行的操作。
3. DB2的SQL语言
- DB2使用SQL(Structured Query Language)作为操作数据库的语言。
- SQL语言是一种标准的关系数据库查询语言,支持创建、更新和查询数据库表。
- 在DB2中,您可以使用SQL语句来创建表、插入数据、
更新数据、删除数据以及查询数据。
4. DB2的高级主题
- 数据库管理:您可以使用DB2的管理工具来管理数据库,包括备份和恢复、数据导入和导出等操作。
- 性能调优:DB2提供了一些性能调优的工具和功能,可以帮助您优化数据库的性能。
- 安全性:通过用户权限管理和数据加密等技术,DB2可以保护数据库的安全性。
- 高可用性:DB2支持在多个服务器之间实现数据的备份和复制,以保证数据库的高可用性。
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 table
String hostVar = null;
#sql[ctx]{
SELECT col INTO :hostvar FROM tablename WHERE objID=:objectID
};
} catch(SQLException e){
logf("Error: Cannot execute SQL statement.");
e.printStackTrace();
DB2SQLCODE大全
DB2SQLCODE大全
DB2错误信息
sqlcode sqlstate 说明
000 00000 SQL语句成功完成
01xxx SQL语句成功完成,但是有警告
+012 01545 未限定的列名被解释为一个有相互关系的引用
+098 01568 动态SQL语句用分号结束
+100 02000 没有找到满足SQL语句的行
+110 01561 用DA TA CAPTURE定义的表的更新操作不能发送到原来的子系统
+111 01590 为2型索引设置了SUBPAGES语句
+117 01525 要插入的值的个数不等于被插入表的列数
+162 01514 指定的表空间被置为检查挂起状态
+203 01552 使用非唯一的名字来解决命名的限定列
+204 01532 命名的对象未在DB2中定义
+206 01533 命名的列不在SQL语句中指定的任何表中存在
+218 01537 因为SQL语句引用一个远程对象,不能为该SQL语句执行EXPLAIN
+219 01532 命名的PLAN TABLE不存在
+220 01546 不正确定义PLAN TABLE,检查命名列的定义
+236 01005 SQLDA中的SQLN的值至少应于所描述的列的个数一样大
+237 01594 至少有一个被描述的列应该是单值类型,因此扩展的SQLV AR条目需要另外的空间
+238 01005 至少应有一个被描述的列是一个LOB,因此扩展的SQLVAR条目需要另外的空间
+239 01005 至少应有一个被描述的列应是单值类型,因此扩展的SQLV AR条目需要另外的空间
DB2_存储过程执行计划的查看及监控方法
一,编写存储过程。
[db2inst1@db2lab ~]$ cat test.sql
create procedure sales_status
(in quota integer)
dynamic result sets 2
language sql
begin
declare SQLSTATE char(5);
declare rs cursor with return for
select * from t1;
open rs;
end
@
二,建立存储过程
[db2inst1@db2lab~]$**************
DB20000I The SQL command completed successfully.
三,执行存储过程
[db2inst1@db2lab ~]$ db2 "call sales_status(1)"
Result set 1
--------------
ID
-------
1.
1 record(s) selected.
Return Status = 0
四,利用表函数MON_GET_PKG_CACHE_STMT抓取static的信息,获取PACKAGE_NAME及SQL语句
[db2inst1@db2lab ~]$ db2 "select
PACKAGE_NAME,SECTION_NUMBER,EXECUTABLE_ID
from TABLE(MON_GET_PKG_CACHE_STMT ( 'S', NULL, NULL, -1)) as T" PACKAGE_NAME
SECTION_NUMBER EXECUTABLE_ID -------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------------------------------------------------------
db2存储过程写法
DB2是一种关系型数据库管理系统,支持使用存储过程进行数据处理和业务逻辑的封装。下面是一个简单的DB2存储过程的写法示例:
```sql
CREATE OR REPLACE PROCEDURE sp_example(IN param1 INT, OUT param2 VARCHAR(50))
LANGUAGE SQL
BEGIN
-- 存储过程逻辑代码
DECLARE var1 INT;
SET var1 = param1 + 10;
-- 查询数据
SELECT column_name INTO param2
FROM table_name
WHERE condition;
-- 更新数据
UPDATE table_name
SET column_name = var1
WHERE condition;
-- 返回结果
SET param2 = 'Success';
END@
```
上述示例定义了一个名为`sp_example`的存储过程,接受一个输入参数`param1`(整型)和一个输出参数`param2`(字符型)。在存储过程中,可以编写逻辑代码来处理数据,包括声明变量、查询数据、更新数据等操作。
需要注意几点:
- `LANGUAGE SQL`指定了存储过程使用的语言为SQL。
- `DECLARE`关键字用于声明局部变量,这里的`var1`是一个整型变量。
- 使用`SELECT INTO`语句将查询结果赋值给输出参数`param2`。
- 使用`UPDATE`语句更新表中的数据。
- 最后,使用`SET`语句将结果赋给输出参数`param2`。
DB2存储过程实现查询表数据,生成动态SQL,并执行
DB2存储过程实现查询表数据,⽣成动态SQL,并执⾏⼀、动态执⾏SQL
PREPARE S1 FROM'delete from test';
EXECUTE S1;
⼆、使⽤游标
DECLARE V_CURSOR CURSOR FOR
SELECT DELETESQL,INSERTSQL FROM FJDC.V_I_DG_DM_ZY_WL_ZBHZ_ATTR T;
OPEN V_CURSOR;
FETCH V_CURSOR INTO V_DELETESQL,V_INSERTSQL;
CLOSE V_CURSOR;
三、WHILE循环
WHILE true DO
表达式
END WHILE;
四、DB2查询表数据,⽣成动态SQL,并执⾏
1CREATE PROCEDURE "TEST"."TEST" ()
2BEGIN
3DECLARE V_DELETESQL VARCHAR(2000);
4DECLARE V_INSERTSQL VARCHAR(2000);
5DECLARE I_COUNT INT;
6
7--确定循环次数
8SELECT COUNT(INSERTSQL) INTO I_COUNT FROM FJDC.V_I_DG_DM_ZY_WL_ZBHZ_ATTR T;
9IF I_COUNT >0THEN
10--游标
11DECLARE V_CURSOR CURSOR FOR
12SELECT DELETESQL,INSERTSQL FROM FJDC.V_I_DG_DM_ZY_WL_ZBHZ_ATTR T;
13
DB2(Procedure)存储过程遍历循环!
DB2(Procedure)存储过程遍历循环!
作者博客地址更换⾄CSDN,地址:/littlebrain4solving
由于有时候⼀些复杂的业务逻辑将要通过存储过程的循环语句进⾏处理;以下列出2种DB2存储过程的循环语句,⽅便以后的查看并使⽤!本⼈推荐第⼀种⽅式的使⽤,最⼤的优点就是⽐较直观;在需要操作很多字段的情况下,不需要定义太多的字段变量作为中间存储媒介.
⼀.FOR⽅式(FOR .. AS [游标名] CURSOR FOR [SELECT......])
BEGIN--语句块,必须要加上,否则会出错.
FOR V AS MYCURSOR CURSOR FOR SELECT ID,NAME,AGE FROM PEOPLE
DO
BEGIN
--这⾥进⾏业务逻辑处理,每⾏循环的时候,每列的值将会存放于V变量中
--⽰例: 把数据插⼊到另外⼀张表
INSERT INTO PERSON(NAME,AGE) VALUES(,V.AGE);
END;
END FOR;
END;
⼆.WHILE⽅式(DECLARE [游标名] CURSOR FOR [SELECT.....])
BEGIN--语句块,必须要加上,否则会出错.
DECLARE NOTFOUND INT DEFAULT0;
DECLARE V_NAME VARCHAR(20);
DECLARE V_AGE VARCHAR(20);
DECLARE MYCURSOR CURSOR FOR SELECT NAME,AGE FROM PEOPLE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET NOTFOUND =1;
DB2存储过程学习笔记
创建:db2-td@-vf createSQLproc.db2--end@ (此处的@可替换成其他符号)调用:db2call过程名(参数)
1 基础
--声明变量:
DECLARE
--赋值:
SET x=10;
SET y=(SELECT SUM(c1)from T1);
VALUES10INTO x;
SELECT SUM(c1)INTO y from T1;
--会话全局变量:
CREATE VARIABLE var_name DATATYPE[DEAFULT value];
2 、数组
2.1定义
CREATE TYPE mynames as VARCHAR(30)ARRAY[];--定义数组
2.2声明
DECLARE nameArr mynames;--声明数组
2.3赋值
SET TESTARR=ARRAY[1,2,3,4,5,6,7,8,9,10];SET TESTARR=ARRAY[VALU ES(1),(2)];--方法1,使用SET语句
SELECT SUM(NUM)INTO TESTARR[1]FROM(VALUES(1),(2))AS TEMP(NU M);--方法2,使用VALUES INTO语句
VALUES1INTO TESTARR[1];--方法3,使用SELECT INTO语句
SET TESTARR[1]=1;--方法4,使用ARRAY构造函数
2.4操作数组的函数
ARRAY_DELETE:删除数组元素
TRIM_ARRAY:从右开始删除指定数目个元素
ARRAY_FIRST:返回数组中第一个元素
DB2存储过程
DB2存储过程-基础详解 简介 DB2 SQL Procedural Language(SQL PL)是 SQL Persistent Stored Module 语言标准的一个子集。该标准结合了 SQL 访问数据的方便性和编程语言的流控制。通过 SQL PL 当前的语句集合和语言特性,可以用 SQL 开发综合的、高级的程序,例如函数、存储过程和触发器。这样便可以将业务逻辑封装到易于维护的数据库对象中,从而提高数据库应用程序的性能。SQL PL 支持本地和全局变量,包括声明和赋值,还支持条件语句和迭代语句、控制语句的转移、错误管理语句以及返回结果集的方法。这些话题将在本教程中讨论。变量声明 SQL 过程允许使用本地变量赋予和获取 SQL 值,以支持所有 SQL 逻辑。在 SQL 过程中,在代码中使用本地变量之前要先进行声明。清单 1 中的图演示了变量声明的语法:清单 1. 变量声明的语法 .-,-----------------. V | |--DECLARE----SQL-variable-name-+------------------------------->.-DEFAULT NULL------. >--+-data-type--+-------------------+-+-------------------------|| '-DEFAULT--constant-' | SQL-variable-name 定义本地变量的名称。该名称不能与其他变量或参数名称相同,也不能与列名相同。图 1 显示了受支持的 DB2 数据类型:DEFAULT 值 – 如果没有指定,在声明时将赋值为 NULL。下面是变量声明的一些例子:DECLARE v_salary DEC(9,2) DEFAULT 0.0; DECLARE v_status char(3) DEFAULT ‘YES’; DECLARE v_descrition VARCHAR(80); DECLARE v1, v2 INT DEFAULT 0; 请注意,从 DB2 version 9.5 开始才支持在一个 DECLARE 语句中声明多个相同数据类型的变量。数组数据类型 SQL 过程从 9.5 版开始支持数组类型的变量和参数。要定义一个数组类型的变量,需要先在数据库中创建该类型,然后在过程或应用程序中声明它。数组是临时的值,可以在存储过程和应用程序中操纵它,但是不能将它存储到表中。DB2 支持以下创建数组数据类型的语法:清单 2. 创建数组数据类型的语法 Sql代码 >>-CREATE TYPE—array-type-name--AS--| data-type |--ARRAY--[----------> .-2147483647-------. >--+------------------+--]------------------------------------->< '-integer-constant-' >>-CREATE TYPE—array-type-name--AS--| data-type |--ARRAY--[---------->.-2147483647-------. >--+------------------+--]-------------------------------------><'-integer-constant-' 数组类型的名称应该用模式加以限定,并且在当前服务器上应该是惟一的。LONG VARCHAR、LONG VARGRPAHIC、XML 和用户定义类型不能作为数组元素的数据类型。下面是数组类型的例子:Sql代码 CREATE TYPE numbers as INTEGER ARRAY[100]; CREATE TYPE names as VARCHAR(
DB2基础教程文档
DB2基础教程文档
DB2是一个关系型数据库管理系统(RDBMS),用于存储、管理和操作数据。它是由IBM开发的,被广泛应用于企业级应用程序和数据仓库。
本教程将介绍DB2的基本概念、常用命令和操作,帮助初学者快速入门并使用DB2进行开发和管理。
1.DB2简介
-DB2的历史和发展
-DB2的特点和优势
-DB2的应用场景
2.安装和配置DB2
-配置DB2实例
-创建和配置数据库
3.数据库对象的管理
-创建表和定义列
-管理数据类型和约束
-创建索引和视图
-管理存储过程和触发器
4.数据的插入、查询和更新
-插入数据到表中
-使用SELECT语句查询数据-更新和删除数据
-使用JOIN操作关联表
5.数据库事务和并发控制
-事务的概念和特性
-事务的隔离级别
-并发控制的方法和技术
6.数据库备份和恢复
-备份和还原数据库
-日志和事务恢复
-数据库迁移和升级
7.性能优化和查询调优
-查询执行计划的分析
-索引的设计和优化
-查询性能调优的常用技巧8.高级功能和扩展
-分布式数据库和数据复制-数据库安全和权限管理
-数据库监控和性能调优工具
9.常用的DB2命令和工具
-DB2的命令行工具
- 使用DB2 Control Center管理数据库
- 使用IBM Data Studio进行开发和调试
10.实际案例和练习
-设计和创建一个简单的数据库
-实现一个实际应用的数据模型
-进行数据库调优和性能提升的练习
总结:DB2是一款功能强大的关系型数据库管理系统,本教程详细介绍了DB2的基本概念、常用命令和操作,帮助初学者快速入门并能够实践开发和管理数据库。希望通过学习本教程,读者能够掌握DB2的基本知识和技能,并在实际应用中获得更好的数据库性能和效果。
DB2SQLCODE大全
DB2SQLCODE⼤全
DB2错误信息
sqlcode sqlstate 说明
000 00000 SQL语句成功完成
01xxx SQL语句成功完成,但是有警告
+012 01545 未限定的列名被解释为⼀个有相互关系的引⽤
+098 01568 动态SQL语句⽤分号结束
+100 02000 没有找到满⾜SQL语句的⾏
+110 01561 ⽤DATA CAPTURE定义的表的更新操作不能发送到原来的⼦系统
+111 01590 为2型索引设置了SUBPAGES语句
+117 01525 要插⼊的值的个数不等于被插⼊表的列数
+162 01514 指定的表空间被置为检查挂起状态
+203 01552 使⽤⾮唯⼀的名字来解决命名的限定列
+204 01532 命名的对象未在DB2中定义
+206 01533 命名的列不在SQL语句中指定的任何表中存在
+218 01537 因为SQL语句引⽤⼀个远程对象,不能为该SQL语句执⾏EXPLAIN
+219 01532 命名的PLAN TABLE不存在
+220 01546 不正确定义PLAN TABLE,检查命名列的定义
+236 01005 SQLDA中的SQLN的值⾄少应于所描述的列的个数⼀样⼤
+237 01594 ⾄少有⼀个被描述的列应该是单值类型,因此扩展的SQLVAR条⽬需要另外的空间
+238 01005 ⾄少应有⼀个被描述的列是⼀个LOB,因此扩展的SQLVAR条⽬需要另外的空间
+239 01005 ⾄少应有⼀个被描述的列应是单值类型,因此扩展的SQLVAR条⽬需要另外的空间
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 STYLE
DB2GENERAL 的存储过程,那么要求被调用 Java 类是 public
的并继承了接口 COM.ibm.db2.app.StoredProc 。
1.检查 Java 代码中的类 / 方法名和存储过程 DDL
中 Java 类 / 方法名是否一致;
2.检查 jar/calss 文件是否在 CLASSPATH 中,如
sqllib/function 目录下;
3.检查是否 DDL 指定了 PARAMETER STYLE
DB2GENERAL 而 Java 代码类是否是 public 并继承
接口 COM.ibm.db2.app.StoredProc 。
SQL4302N
过程或用户定义的函数 名称(特定名称 特定名称)由于异常 字符串 而
存储过程由于异常而异常终止。通常可能是查询返回是空的
数据集,或是 SQL 中使用“select into :hostvar”但是实际查
询返回多条数据,或 Java 运行中出现空指针异常等。
检查 db2diag.log 诊断日志,找到错误,修正 Java
代码。
异常终止。
SQL4301N
Java 或 .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 吗?