级别: 中级 Thomas Sharp, 例程调试架构师, IBM
2009 年 11 月 05 日 本文介绍如何使用 IBM® Data Studio 2.2 和 Optim™ Development Studio 2.2 开发使用 Oracle PL/SQL 的例程。它展示了如何为以下数据库创建、编辑、部署和调试 PL/SQL 包、过程和函数:DB2® for Linux®, UNIX®, and Windows® Version 9.7、Oracle 10g 和 Oracle 11g。
概述
本文提供关于如何使用 Optim Development Studio (ODS) 为 DB2 Linux, UNIX, and Windows (LUW) Version 9.7、Oracle 10g 和 Oracle 11g 数据库创建、编辑、部署和调试 PL/SQL 例程的信息。本文假设您具备 DB2 和 Oracle 的基础知识,并熟悉基于 Eclipse 的开发环境。
IBM 的免费产品 Data Studio 2.2 也提供使用 PL/SQL 进行开发、调试和部署的功能。不过,Data Studio 仅支持在兼容模式下针对 DB2 9.7 数据库进行开发和部署。要针对 Oracle 数据库进行开发和部署,您必须使用 Optim Development Studio 2.2 或更新版本。要试用本文描述的功能,请从 参考资料 部分下载 Optim Development Studio 的试用版本或 Data Studio 的完整本版。
什么是 Optim Development Studio?
Optim Development Studio(Data Studio Developer 的新名称)提供一个基于 Eclipse 的集成开发环境,从而加快针对 DB2、Informix 和 Oracle 数据库的以数据为中心的开发。
除了基础的数据库管理功能和开发数据库例程功能之外,Optim Development Studio 还提供改进的功能,可以为异构数据库开发和优化 Java 数据库应用程序,从而将数据库开发提升到一个更高的级别。要更多地了解关于 Java 开发支持的信息,请查看 Optim Development Studio 产品包和 Integrated Data Management Information Center,本文的 参考资料 部分提供它们的链接。
在以前版本的 Optim Development Studio 中,您可以使用 Java 开发客户端应用程序,以及通过高级向导、编辑器、部署工具和调试器使用 Java 开发服务器端业务逻辑。2.2 版本还支持使用 PL/SQL 开发服务器端业务逻辑。它允许您在 Data Project Explorer 中管理 PL/SQL 对象,以及在 Data Source Explorer 中开发 PL/SQL 包、过程和函数。
因为 Optim Development Studio 2.2 基于 Eclipse 3.4.2,所以您可以在安装了其他基于 Eclipse 3.4.2 的产品的 Eclipse “shell” 中安装它。
什么是 PL/SQL?
PL/SQL 是 Oracle 针对 SQL 的过程语言扩展。就像原生的 SQL for DB2 一样,PL/SQL 是 SQL 的一种变体,它为实现在数据库服务器上运行的逻辑提供 3GL 结构。
您可以使用 PL/SQL 创建例程、过程和函数,以及创建包含数据类型定义、变量声明、过程和函数的 PL/SQL 包。
PL/SQL 例程仅重载位于相同 PL/SQL 包中的另一个同类型的例程(过程或函数)。PL/SQL 包的内容是一起编辑、部署和调试的。它们在数据库服务器中被当作一个单元管理,并且由 PL/SQL 包及其模式进行限定。
一个 PL/SQL 包由两个部分组成:
- 指定例程和声明异常的规范
- 包含变量和游标声明、例程主体和可选初始化部分的主体
规范是接口的公共声明;主体是它的私有实现。
 |
辨明术语包
不要将 PL/SQL 包和 DB2 (SQL) 包混淆了。DB2 包是一个数据库对象。它是绑定 SQL 应用程序或例程以封装静态 SQL 语句和 DB2 数据访问计划的结果。PL/SQL 包是一种编程结构。它是 PL/SQL 语句的容器。
|
|
当您在 DB2 LUW 9.7 上部署 PL/SQL 包时,DB2 将把它编译成 DB2 模块,该模块是类似于 PL/SQL 包的原生 SQL 对象。就像 PL/SQL 包一样,DB2 模块包含条件、函数、过程、用户定义类型和变量。与 PL/SQL 包不同的是,DB2 模块仅在逻辑上包含它的元素。它没有指定自己的内容的源文件。相反,在创建 DB2 模块之后,您将编写一个 ALTER 语句序列来向它添加元素。
要创建 DB2 模块,您可以使用 Data Source Explorer 的 Data Object 编辑器,或在您的项目的 SQL 脚本中输入 CREATE 和 ALTER 语句,然后运行脚本。
PL/SQL 功能总结
Optim Development Studios (ODS) 2.2 支持 DB2 模块和 PL/SQL for DB2 LUW 9.7。它还支持 PL/SQL for Oracle 10g 和 11g。要处理 PL/SQL,需要使用 ODS Data 透视图。
表 1. PL/SQL 的新功能
| 视图 — 连接类型 | 新功能 |
|---|
| Data Source Explorer—DB2 LUW 9.7 |
- 在模式的 PL/SQL Packages 文件夹中显示一个 PL/SQL 包。没有展开显示它们的内容。
- 在模式的文件夹中显示一个 PL/SQL 过程或函数。
- 在 Properties 视图中查看 PL/SQL 包、过程或函数。
- 比较两个同类型的 PL/SQL 对象。
- 运行独立或位于 PL/SQL 包中的 PL/SQL 过程或函数,并在 SQL Results 视图中查看运行结果。
| | Data Source Explorer—Oracle 10g 或 11g |
- 在模式的 PL/SQL Packages 文件夹中显示一个 PL/SQL 包。没有展开显示它们的内容。
- 在模式的文件夹中显示一个 PL/SQL 过程或函数。
- 在 Properties 视图中查看 PL/SQL 包、过程或函数。
- 比较两个同类型的 PL/SQL 对象。
- 运行独立或位于 PL/SQL 包中的 PL/SQL 过程或函数,并在 SQL Results 视图中查看运行结果。
| | Data Project Explorer—DB2 LUW 9.7 |
- 创建一个 PL/SQL 包。
- 创建一个独立的 PL/SQL 过程。
- 创建一个独立的 PL/SQL 函数。
- 在文件夹中部署 PL/SQL 对象。
- 通过运行测试 PL/SQL 过程或函数,并在 SQL Results 视图查看运行结果。
- 在 PL/SQL 包中调试过程或函数。
- 调试独立的 PL/SQL 过程。
- 从 Data Source Explorer 中的 Oracle 或 DB2 连接将一个 PL/SQL 包或例程拖放或复制到您的项目。
- 将 PL/SQL 包或例程从一个项目拖放或复制到另一个项目。
| | Data Project Explorer—Oracle 10g 或 11g |
- 创建一个 PL/SQL 包。
- 创建一个独立的 PL/SQL 过程。
- 创建一个独立的 PL/SQL 函数。
- 在文件夹中部署 PL/SQL 对象。
- 通过运行测试 PL/SQL 过程或函数,并在 SQL Results 视图查看运行结果。
- 在 PL/SQL 包中调试过程或函数。
- 调试独立的 PL/SQL 过程。
- 从 Data Source Explorer 中的 Oracle 连接将一个 PL/SQL 包或例程拖放或复制到您的项目。
- 将 PL/SQL 包或例程从一个项目拖放或复制到另一个项目。
| | SQL Results 视图 |
- 在成功运行或调试 PL/SQL 例程之后,查看参数输入、参数输出和返回的结果集。
- 在从数据库部署、调试或删除对象失败之后,查看错误消息。
| | PL/SQL 包编辑器 |
- 在 Specification 选项卡中编辑规范。
- 限定或重命名 PL/SQL 包,以在 Data Project Explorer 中更新它。
- 在 Body 选项卡中编辑主体。
| | PL/SQL 过程编辑器 |
- 在 Source 选项卡中编辑源。
- 限定或重命名过程,以在 Data Project Explorer 中更新它。
- 在 Configuration 选项卡中编辑模型属性。
| | PL/SQL 函数编辑器 |
- 在 Source 选项卡中编辑源。
- 限定或重命名函数,以在 Data Project Explorer 中更新它。
- 在 Configuration 选项卡中编辑模型属性。
|
连接到 DB2 LUW 9.7 中的 PL/SQL 兼容数据库
要创建一个兼容 PL/SQL 的名为 cdbname 的数据库,请在 DB2 命令窗口中输入以下语句:
DB2SET DB2_COMPATIBILITY_VECTOR=FFF
DB2STOP && DB2START
DB2 CREATE DATABASE cdbname
|
对于 cdbname 数据库,DB2 支持特定于 PL/SQL 的数据类型。如果您从 DB2 命令窗口连接到 cdbname 数据库,并获得数据库配置,那么可以使用以下命令确认下面的兼容性设置已经启用(在 Linux 上使用 grep 代替 findstr):
DB2 CONNECT TO cdbname
DB2 GET DB CFG | findstr compatibility
Number compatibility = ON
Varchar2 compatibility = ON
Date compatibility = ON
DB2 DISCONNECT cdbname
|
 | 弹出菜单键盘快捷方式
在大部分情况下,您可以通过 Shift+F10 键盘快捷方式查看当前视图或选择的弹出菜单。该快捷方式可以代替右键单击。
|
|
要为 DB2 LUW 9.7 包含的 GSDB 样例数据库创建数据库连接,请遵循以下步骤:
- 从 Data Source Explorer 单击 New Connection Profile 工具栏按钮:
或者右键单击 Database Connections 文件夹并从弹出菜单选择 New...。这两个操作之一都能够导致出现 New Connection 向导,如图 1 所示。
图 1. 在 DB2 9.7 上创建一个到 GSDB 的连接
为您的数据库管理器选择 DB2 for Linux, UNIX, and Windows。
选择 IBM Data Server Driver for JDBC and SQLJ (JDBC 4.0) Default 驱动程序并指定数据库名、宿主服务器名、连接端口号、用户名和用户密码。IBM JDBC 驱动程序的定义是预定义的,并且它的 JAR 包与 ODS 2.2 捆绑在一起。
单击 Finish。Data Source Explorer 中将出现连接配置文件。如图 2 所示。
图 2. 在 Data Source Explorer 中浏览新的 DB2-GSDB 连接配置文件
注意,图 2 中显示的 DB2-GSDB 连接配置文件后面跟着一个名为 GSDB [DB2 Alias] 的连接。如果您安装了 DB2 客户端,并通过从本地创建数据库或使用 Configuration Assistant 添加了 DB2 数据库副本,那么在您创建或打开工作空间时,数据库副本将自动出现在 Data Source Explorer 中。
因为数据库版本对 DB2 副本的用户是隐藏的,所以副本配置文件被认为是到 DB2 LUW 9.1 的连接。因此,当您创建一个与它相关联的数据开发项目时,ODS 2.2 将不显示 PL/SQL 文件夹或操作。不过,如果您为该配置文件指定一个经过授权的用户 ID 和密码,并将它连接到数据库,那么 ODS 2.2 将发现实际的 DB2 平台和版本。如果实际的平台和版本为 DB2 LUW 和 9.7,那么 ODS 2.2 将显示 PL/SQL 文件夹和操作。
第一次尝试连接 DB2 副本时,ODS 2.2 将提示您输入用户名和密码,如图 3 所示。
图 3. 输入用户名和密码进行连接
连接到 Oracle 10g 或 11g
ODS 并没有捆绑连接到 Oracle 数据库服务器所需的 JDBC 驱动程序。因此,您首先要获得一个支持 Oracle 或 DataDirect 的 JDBC 驱动程序。这些 JDBC 驱动程序是授权许可产品,并必须付费或获得授权才能使用。
Oracle 开发人员可以在 Oracle Technology Network Web 站点进行注册,接受 OTN Development 和 Distribution License Agreement,然后下载 Oracle JDBC 驱动程序。参考资料 部分提供 Oracle JDBC 驱动程序下载页面的链接。
Oracle 提供瘦 JDBC 驱动程序和 Oracle 调用接口(OCI)JDBC 驱动程序。瘦驱动程序不需要 Oracle Database Client。OCI 则需要 Oracle Database Client(或者下载所需的等效库)。
使用 Oracle 瘦 JDBC 驱动程序连接到 Oracle
Oracle 为 1.1.1 以后的各种 JRE 实现一个新的 JDBC 驱动程序。您最好在最新的 JRE 上使用该驱动程序。到目前为止,最新的 JRE 是 1.6,它的 JAR 为 ojdbc6.jar。ODS 2.2 扩展的 Eclipse 版本构建在 JRE 1.6 之上。
遵循以下步骤使用 Oracle 瘦 JDBC 驱动程序连接到 Oracle:
- 获取 ojdbc6.jar 文件,并将它复制到硬盘驱动器的某个目录下,比如 C:\jdbcDrivers\Oracle。
- 在 Data Source Explorer 中,右键单击 Database Connections 文件夹并从弹出菜单选择 New...。
- 将出现 New Connection 向导,如图 4 所示。
图 4. 选择 Oracle 瘦 JDBC 驱动程序
在这里,您必须为数据库管理器选择 Oracle,并且选择一个瘦驱动程序,比如 Oracle 11 - Oracle Thin Driver Default。
填充 General 属性标识您的 Oracle 数据库服务器。
- 单击 JDBC 驱动程序右侧的 Edit Jar List... 图标:

这时将出现 Edit Jar List 对话框,如图 5 所示。
图 5. 指定 ojdbc6.jar 的位置
默认列出的 ojdbc6.jar 文件是一个占位符;您需要指定它的完整路径(例如,C:\jdbcDrivers\Oracle\ojdbc6.jar)。
- 选择该占位符并单击 Edit JAR/Zip...。这时将出现一个文件部分对话框。
- 导航到您的 ojdbc6.jar 副本并选择它,然后单击 Open。路径将出现在 Edit Jar List 对话框中。
- 单击 OK。
- 返回到 New Connection 向导并单击 Test Connection。这时将出现一条确认消息,如图 6 所示。
图 6. 接受连接确认
- 单击 OK。
- 单击 Finish。这时,连接配置文件将出现在 Data Source Explorer 中,如图 7 所示。
图 7. 在 Data Source Explorer 中浏览新的 Oracle 连接配置文件
使用 DataDirect Connect JDBC 驱动程序连接到 Oracle
遵循以下步骤使用 DataDirect Connect JDBC 驱动程序连接到 Oracle:
- 从 DataDirect 获取完整的 DataDirect Connect JDBC 驱动程序或仅支持 Oracle 的 DataDirect Connect 4.0 JDBC 驱动程序。
- 如果您使用完整的 DataDirect Connect JDBC 3.7 驱动程序:
- 将 connectjdbc.jar 解压缩到一个名为 installdd 的新目录下。您可以免费试用 15 天。
注意:不要使用安装目录中的 LicenseTool.jar 延长许可的有效期。这样做可能不成功或带来损害。
- 从 installdd 目录运行 Installer,并选择用于安装驱动程序的目录(例如,C:\jdbcDrivers\Oracle\datadirect directory)。
- 如果您使用仅支持 Oracle 的 DataDirect Connect JDBC 驱动程序,那么应该许可中的条款使用 oracle.jar。
- 在 ODS 中打开 Window -> Preferences,然后选择 Data Management
-> Connectivity ->
Driver Definitions。
- 单击 Add...。
- 以下的表详细说明如何根据所使用的 Oracle 数据库和驱动程序填充 New Driver Definition 对话框上的字段。
名称/类型:
| Oracle 10 | Oracle 11 |
|---|
| Driver Type Filter | Database | Database | | Vendor Filter | Oracle | Oracle | | Available driver templates | Other Driver / Oracle / 10 | Other Driver / Oracle / 11 | | Driver name | DataDirect Connect for Oracle 10 | DataDirect Connect for Oracle 11 | | Driver type | Other Driver | Other Driver |
Jar List Driver 文件:
| Full DataDirect Connect 3.7 Driver | Oracle-Only (4.0) Driver |
|---|
C:\jdbcDrivers\Oracle\datadirect\lib\base.jar
C:\jdbcDrivers\Oracle\datadirect\lib\util.jar
C:\jdbcDrivers\Oracle\datadirect\lib\oracle.jar
|
C:\jdbcDrivers\Oracle\datadirect\oracle.jar
|
属性:
| Oracle 10 | Oracle 11 |
|---|
| Catalog | ALL | ALL | | Connection URL | jdbc:datadirect:oracle://habu.svl
.ibm.com:1521;SID=ora10g | jdbc:datadirect:oracle://chex.svl
.ibm.com:1521;SID=ORA11 | | Database Name | oracle | oracle | | Driver Class | com.ddtek.jdbc.oracle.OracleDriver | com.ddtek.jdbc.oracle.OracleDriver | | Password(可选) | | | | User ID(可选) | CRIOLLO1 | CRIOLLO1 | 注意:您可以将 SID 放在以上的连接 URL 上,或在 Optional 选项卡上将它添加为额外的属性。 |
- 完成这些字段设置之后,您可以从 Data Source Explorer 通过 New Connection 向导使用该驱动程序定义创建一个新的连接配置文件。
Oracle 目录视图
在创建 Oracle 连接时,可以选择以下 3 种目录视图之一,以过滤在 Data Source Explorer 看到的结果:
- All
- 该视图描述您可以访问的所有对象。
- DBA
- 该视图描述数据库中的所有对象。
- User
- 该视图描述您拥有的对象。
浏览数据库和对象
在创建数据库连接之后,它的连接配置文件将出现在 Data Source Explorer 中。
展开到 GSDB 的 DB2 连接查看它的主要文件夹。您感兴趣的大部分信息包含在 Schemas 文件夹中。展开该文件夹,滚动到默认的模式名,然后展开它查看其中包含的子文件夹,如图 8 所示。
图 8. 展开 DB2 连接查看 GOSALES 模式中的文件夹
展开 Oracle 连接查看它的主文件夹。展开 Schemas 文件夹,滚动到默认的模式名,然后查看它包含的子文件夹,如图 9 所示。
图 9. 展开 Oracle 连接查看 CRIOLO1 模式中包含的文件夹
您将看到文件夹下面的现有对象。选中一个现有对象时,可以在 Properties 视图中看到它的属性。Properties 视图中的 General 选项卡标识对象,如图 10 所示。
图 10. 浏览存储过程的 General 属性
从 Oracle 的角度看,这个 PL/SQL 过程的实现语言为 SQL 而不是 PL/SQL。ODS 2.2 在开发上区分 SQL 和 PL/SQL。
Parameters 选项卡显示输入和输出参数,如图 11 所示。
图 11. 浏览存储过程的参数
该存储过程的 Source 选项卡显示它的 CREATE 语句,如图 12 所示。
图 12. 浏览存储过程的源
 |
离线工作
Data 透视图的目的是帮助您处理数据库;不过,当您正在旅途中或网络中断时仍然可以完成一些工作。这称为离线工作。
要为离线工作在工作空间中缓存数据库目录信息,通过右键单击连接配置文件从弹出菜单中选择以下操作:
- Connect
- Save Offline
- Disconnect
- Work Offline
您可以根据连接配置文件上的弹出菜单是否允许您进行连接或断开连接来判断是否处于离线工作状态,但它并不允许您在离线时工作或保存工作。
当您离线工作时,可以:
- 展开数据库查看模式中的所有对象以及它们的属性。
- 为数据库连接创建数据开发项目。
- 从 Data Source Explorer 拖放(或复制粘贴)PL/SQL 包和例程到 Data Project Explorer 的项目中。
- 在您的项目中创建新的 PL/SQL 包和例程。
- 在您的项目中编辑对象。
不过,如果您在项目中选择需要连接的操作,比如 Run 或 Deploy,将提示您进行连接。如果不进行连接,就不能完成该操作。
|
|
如您在以上的 CREATE 语句所见,TEST_NUMERIC 过程收到一个 DECIMAL 和 NUMERIC,并且返回这些值时增加了 1。
通过将源和这些参数进行比较,您还可以看到,尽管 VAR01 参数的数据类型被定义为 DECIMAL,Oracle 数据库服务器会将它规范化为 NUMBER。
Oracle NUMBER 可以是整数、浮点数或分数,这取决于可选的总长度和小数位数。
为 Oracle 开发 PL/SQL 对象
使用 Optim Development Studio 开发 PL/SQL 包和例程的流程与开发 DB2 包和例程的流程相似。
因为 Optim Development Studio 2.2 对 Oracle 和 DB2 支持 PL/SQL,所以您可以轻松地将工作从 Oracle 转移到 DB2,即从 Data Project Explorer 中的 Oracle 项目,或从 Data Source Explorer 中的 Oracle 数据库将对象拖放到 Data Project Explorer 中的 DB2 项目。
创建 Oracle 数据库开发项目
数据开发项目包含一组 SQL 脚本、例程和与 XML 相关的资源,它们仅与 Data Source Explorer 中的一个数据库连接配置文件相关联。与 DB2 LUW 9.7 连接配置文件相关联的数据开发项目称为 DB2 项目,与 Oracle 10g 或 11g 连接配置文件相关联的数据开发项目称为 Oracle 项目。
遵循以下步骤在 Data Project Explorer 中创建数据开发项目:
- 右键单击 Data Project Explorer 背景的空白部分打开弹出菜单。选择 New -> Data Development Project,如图 13 所示。
图 13. 启动创建新数据开发项目的向导

仅当视图中未选择任何东西并单击空白部分时才会出现该菜单。
- 将出现向导的 Development Project 页面。为项目输入一个名称,如图 14 所示,然后单击 Next >。
图 14. 命名数据开发项目
- 从 Select Connection 页面选择一个现有的 Oracle 连接,如图 15 所示,或创建一个新连接。
图 15. 为数据开发项目选择连接配置文件
- 单击 Finish。现在项目出现在 Data Project Explorer 中。
展开项目。图 16 展示了示例 Oracle 项目的外观。
图 16. 展开 Oracle 项目的文件夹
每个文件夹仅包含一个类型的资源。您可以右键单击任何文件夹,并使用弹出菜单调用一个向导,它允许您创建可以包含在该文件夹中的资源。
数据开发项目中的文件夹上的每个 New 操作都打开一个向导,它用于创建文件夹名表示的类型的对象。
为 Oracle 创建 PL/SQL 过程
遵循以下步骤使用 New Stored Procedure 向导创建一个 PL/SQL 过程:
- 右键单击您的 Oracle 数据开发项目的 Stored Procedures 文件夹。从弹出菜单选择 New -> Stored Procedure。这时将出现 New Stored Procedure 向导,如图 17 所示。
图 17. 命名新的 Oracle PL/SQL 过程
对于 Oracle,PL/SQL 是唯一受支持的语言,因此禁用了 Language 字段。
- 默认情况下,Project 字段的值为包含您的选择的项目。您也可以为新的过程选择不同的目标项目,或使用 New... 按钮创建不同的目标项目。
- 为过程输入名称。您可以用所有者限定这个名称(例如
CRIOLLO1.TESTPROCEDURE)。您还可以分隔过程名称,以使用小写字母或允许空格或特殊字符(例如 CRIOLLO1."Test.Procedure")。对于 Oracle,名称(没有所有者)最长为 30 个字符。
-
单击 Next > 显示 Parameters 页面,如图 18 所示。
图 18. 为 Oracle PL/SQL 过程添加参数
使用 Add... 和 Parameters 对话框添加任何受支持的数据类型的参数。
要了解受支持的数据类型列表,请查看 附录 A。
对于 Oracle,不可以指定参数化数据类型的长度、总长度或小数位数。Oracle 不允许在参数声明中(或在函数的返回类型声明中)使用这些项。不过,Oracle 允许指定数据类型的最大长度、总长度或小数位数。
在 PL/SQL 例程中声明的变量可以包括长度、总长度和小数位数。您可以在例程编辑器中添加这些项。
- 添加了参数之后,单击 Next > 进入 Summary 页面。
- 单击 Show SQL 查看即将生成的 PL/SQL 代码,如图 19 所示。
图 19. 查看 Oracle 过程的 PL/SQL 代码
- 单击 Finish 生成该过程,然后将它添加到您的项目中,并在例程编辑器中打开它。
- 在例程编辑器中检测新的过程。在部署该过程之前,您必须向它的主体添加代码。一个简单并且可以测试的改进是将
VAR01 更改为输出参数,并为它赋值,如下所示:
CREATE OR REPLACE PROCEDURE PROCEDURE1 ( VAR01 OUT INT )
AS
BEGIN
VAR01 := 2020;
END;
|
为 Oracle 创建 PL/SQL 函数
遵循以下步骤使用 New User-Defined Function 向导创建一个 PL/SQL 函数:
- 右键单击您的 Oracle 数据库开发项目的 User-Defined Functions 文件夹。从弹出菜单选择 New -> User-Defined Function。这时将出现 New User-Defined Function 向导,如图 20 所示。
图 20. 命名新的 Oracle PL/SQL 函数
对于 Oracle,PL/SQL 是唯一受支持的语言,因此禁用了 Language 字段。
- 单击 Next > 显示 SQL Statement or Expression 页面,如图 21 所示。
图 21. 为 Oracle 函数指定一个语句或表达式
您可以从这个页面输入该函数将要返回的表达式。您也可以选择不在此处输入表达式,而是随后在例程编辑器更改它。
对 PL/SQL,ODS 2.2 不支持表函数。PL/SQL 函数必须有一个标量结果。
- 单击 Next > 显示 Return Data Type 页面,如图 22 所示。
图 22. 为 Oracle 指定函数返回类型
对于 Oracle,您不能为返回数据类型指定长度、总长度和小数位数。Oracle 不允许在返回类型声明中使用这些项。不过,Oracle允许指定返回数据类型的最大长度、总长度或小数位数。
- 单击 Next > 显示 Parameters 页面,如图 23 所示。
图 23. Oracle PL/SQL 函数的参数
使用 Add... 和 Parameters 对话框添加任何受支持的类型的参数。
- 添加了参数之后,单击 Next > 进入 Summary 页面。
- 单击 Show SQL 查看将要生成的 PL/SQL 代码,如图 24 所示。
图 24. 检查 Oracle 函数的 PL/SQL 代码
ODS 2.2 没有确定表达式的数据类型,并且不能自动地确定返回类型。如果您修改了 SQL 表达式或返回数据类型导致它们不对应,那么生成的代码将不能工作,除非您进行修改。
单击 Finish 生成该函数,将其添加到您的项目并在例程编辑器中打开它。
在例程编辑器中检查新的函数。对于测试,您可以返回输入参数 VAR01 的值,如下所示:
CREATE OR REPLACE FUNCTION FUNCTION1 ( VAR01 INT )
RETURN INT
AS
BEGIN
RETURN VAR01;
END;
|
为 Oracle 创建 PL/SQL 包
遵循以下步骤使用 New PL/SQL Package 向导创建 PL/SQL 包:
- 右键单击您的 Oracle 数据开发项目上的 PL/SQL Packages 文件夹。从弹出菜单选择 New -> PL/SQL Package。这时将出现 New PL/SQL Package 向导,如图 25 所示。
图 25. 命名新的 Oracle PL/SQL 包
这个向导仅有一个页面。指定 PL/SQL 包的目标平台和名称。
- 单击 Finish 生成 PL/SQL 包,将其添加到您的项目并在 PL/SQL 包编辑器中打开它。
-
在编辑器中检查新的 PL/SQL 包。它包含两个例程 ExampleProcedure 和 ExampleFunction,您可以按原样部署和测试它们,或在编辑器中使用您自己的 PL/SQL 包例程替换它们或进行修改。
PL/SQL 包规范为过程和函数提供签名:
CREATE OR REPLACE PACKAGE PACKAGE1
AS
/* PL/SQL package specification */
PROCEDURE ExampleProcedure;
FUNCTION ExampleFunction RETURN INT;
END PACKAGE1;
|
PL/SQL 包体实现过程和函数:
CREATE OR REPLACE PACKAGE BODY PACKAGE1
AS
/* PL/SQL package body */
PROCEDURE ExampleProcedure
AS
X INT := 1;
BEGIN
X := X + 1;
END ExampleProcedure;
FUNCTION ExampleFunction
RETURN INT
AS
X INT;
BEGIN
X := 1;
RETURN (X + 1);
END ExampleFunction;
END PACKAGE1;
|
将表从 DB2 移动到 Oracle
这个小节显示如何编辑您生成的默认 PL/SQL 包,以让它完成一些有用的工作。在后面,您将了解如何将 PL/SQL 包从 Oracle 复制到 DB2。因此,您希望在 DB2 和 Oracle 上拥有相同的表。
本文假设您在 DB2 LUW 9.7 服务器上安装了 GSDB 样例数据库,但并不假设您的 Oracle 数据库拥有相同的样例表。因此,遵循以下步骤在 Oracle 上重新生成 DB2 表及其数据。
- 连接到 GSDB 数据库并展开 GOSALES 模式中的表,以找到 INVENTORY_LEVELS 表。
- 展开表的列,以查看名称和数据类型,如图 26 所示。
图 26. 查看 GOSALES.INVENTORY_LEVELS 表的列
- 右键单击 INVENTORY_LEVELS 表。从弹出菜单选择 Generate DDL...。这时将出现 Generate DDL 向导。
- 取消选择 COMMENT ON statements 和 IN TABLESPACE clause 复选框。仅选择 CREATE statements,如图 27 所示。
图 27. 设置生成 DDL 的选项,以创建 INVENTORY_LEVELS 表
单击 Next >。这时将出现 Objects 页面。
- 单击 Deselect All,然后选择 Primary key constraint
和 Tables 复选框,如图 28 所示。
图 28. 为生成 DDL 选择对象,以创建 INVENTORY_LEVELS 表
- 单击 Next >。这时将出现 Save and Run DDL 页面。
- 在 Preview DDL 区域查看生成的语句:
--<ScriptOptions statementTerminator="!">
CREATE TABLE INVENTORY_LEVELS (
INVENTORY_YEAR SMALLINT NOT NULL,
INVENTORY_MONTH SMALLINT NOT NULL,
WAREHOUSE_BRANCH_CODE INTEGER NOT NULL,
PRODUCT_NUMBER INTEGER NOT NULL,
OPENING_INVENTORY INTEGER,
QUANTITY_SHIPPED INTEGER,
ADDITIONS INTEGER,
UNIT_COST DECIMAL(19 , 2),
CLOSING_INVENTORY INTEGER NOT NULL,
AVERAGE_UNIT_COST DECIMAL(19 , 2)
)
DATA CAPTURE NONE!
ALTER TABLE INVENTORY_LEVELS ADD CONSTRAINT SQL090729130124500 PRIMARY KEY
(INVENTORY_YEAR,
INVENTORY_MONTH,
WAREHOUSE_BRANCH_CODE,
PRODUCT_NUMBER)!
|
- 单击 Browse... 显示 Folder Selection 对话框。
- 选择 Oracle Development 并单击 OK。
- 将 File name 字段的值更改为
inventory_levels.sql,如图 29 所示。
图 29. 为生成的 DDL 指定文件名
- 单击 Next > 显示 Summary 页面。
- 单击 Finish。将在您的 Oracle Development 项目的 SQL Scripts 文件夹中出现 inventory_levels 脚本。
- 该脚本是为 DB2 生成的,但是由于您需要针对 Oracle 运行它,所以需要进入 SQL 编辑器并删除
DATA CAPTURE NONE 子句。修改后的脚本如下所示:
--<ScriptOptions statementTerminator="!">
CREATE TABLE INVENTORY_LEVELS (
INVENTORY_YEAR SMALLINT NOT NULL,
INVENTORY_MONTH SMALLINT NOT NULL,
WAREHOUSE_BRANCH_CODE INTEGER NOT NULL,
PRODUCT_NUMBER INTEGER NOT NULL,
OPENING_INVENTORY INTEGER,
QUANTITY_SHIPPED INTEGER,
ADDITIONS INTEGER,
UNIT_COST DECIMAL(19 , 2),
CLOSING_INVENTORY INTEGER NOT NULL,
AVERAGE_UNIT_COST DECIMAL(19 , 2)
)!
ALTER TABLE INVENTORY_LEVELS ADD CONSTRAINT SQL090729130124500 PRIMARY KEY
(INVENTORY_YEAR,
INVENTORY_MONTH,
WAREHOUSE_BRANCH_CODE,
PRODUCT_NUMBER)!
|
- 在 SQL 编辑器中右键单击。从编辑器的弹出菜单中选择 Run SQL。
当该脚本运行完毕之后,您应该在 SQL Results 视图中看到该操作的 “Succeeded” 状态。由于没有限定 CREATE 语句中的表名,因此该表是在 Oracle 数据库中用您的用户 ID 创建的。
在本小节的其余步骤中,您将把 DB2 中的 INVENTORY_LEVELS 表的数据传输到 Oracle 的对应表中。
- 在到 GSDB 的 DB2 连接中,右键单击 INVENTORY_LEVELS 表。从弹出菜单选择 Data -> Extract...。这时将出现 Extract Data 向导。
- 使用 Output file 字段标识您需要从表中将数据提取到其上的目标文件的路径和名称。您可以选择使用 Browse... 帮助完成该过程。例如,您可以输入
C:\temp\INVENTORY_LEVELS.data,如图 30 所示。
图 30. 从 GOSALES.INVENTORY_LEVELS 导出数据
单击 Finish。将在 SQL Results 视图中开始该操作。当它完成之后,Message1 选项卡将显示以下内容:
Extracting "GOSALES"."INVENTORY_LEVELS"...
Data extraction was successful.
53730 row(s) extracted.
|
- 在 Oracle 连接中,右键单击 INVENTORY_LEVELS 表。从弹出菜单选择 Data -> Load...。这时将出现 Load Data 向导。
- 在 Input file 字段输入在步骤 17 中的 Extract Data 向导中指定的输出文件名和文件路径。
- 单击 Finish。将在 SQL Results 视图中开始该操作。当它完成之后,Oracle 中的 INVENTORY_LEVELS 表将包含对应的 DB2 表中的相同数据。
- 要查看该数据的样例,在 Oracle 连接中右键单击 INVENTORY_LEVELS 表,并从弹出菜单选择 Data -> Sample Contents。
Sample Contents 操作在 SQL Results 视图的 Result1 选项卡中显示样例数据。
为 Oracle 编辑 PL/SQL 包
在向导中创建了新的对象之后,ODS 2.2 就可以在适当的编辑器中打开该对象。
如果您关闭了对象的编辑器,可以通过在数据开发项目中单击该对象打开它,或右键单击该对象并从弹出菜单选择 Open。
- 为您在 Oracle Development 项目中创建的 PACKAGE1 PL/SQL 包打开 PL/SQL 包编辑器。
PL/SQL 包编辑器有两个选项卡,一个用于规范,一个用于主体。规范是 PL/SQL 包的公共 API 的声明。主体是它的实现。
这两个选项卡都使用 SQL 编辑器显示源;不过,默认情况下没有选择 Validate Statement Syntax 选项(显示在编辑器弹出菜单中),因为 ODS 2.2 没有能够验证语法的即时 PL/SQL 解析器。如果您在弹出菜单中选择了该选项,那么 SQL 解析器将在遇到 PL/SQL 语法时生成错误。
这两个选项卡的内容都是完全可编辑的。您可以更改 PL/SQL 包的名称,添加、修改或删除例程,以及(在 Body 选项卡中)实现例程主体。
您可以在编辑器中更改 PL/SQL 包的名称,但您必须在 4 个位置上进行更改:规范和主体的开始和结尾处。当您保存名称变更之后,项目中就更新了名称。
- 转到 Specification 储存库并将包名更改为
INVENTORY,然后使用 QUERY_CLOSING_INVENTORY 函数的签名替换现有的样例,如下所示:
CREATE OR REPLACE PACKAGE INVENTORY
AS
FUNCTION QUERY_CLOSING_INVENTORY(
Y NUMBER,
M NUMBER,
W NUMBER,
P NUMBER
)
RETURN NUMBER;
END INVENTORY;
|
- 转到 Body 选项卡,并将包名更改为
INVENTORY,然后使用 QUERY_CLOSING_INVENTORY 函数的实现替换现有的样例,如下所示:
CREATE OR REPLACE PACKAGE BODY INVENTORY
AS
FUNCTION QUERY_CLOSING_INVENTORY(
Y NUMBER,
M NUMBER,
W NUMBER,
P NUMBER
)
RETURN NUMBER
AS
X NUMBER(38,0);
BEGIN
SELECT CLOSING_INVENTORY INTO X
FROM INVENTORY_LEVELS
WHERE INVENTORY_YEAR = Y
AND INVENTORY_MONTH = M
AND WAREHOUSE_BRANCH_CODE = W
AND PRODUCT_NUMBER = P;
RETURN X;
END;
END INVENTORY;
|
- 通过按下 Ctrl+S 或从主菜单或编辑器的弹出菜单选择 File -> Save 保存更改。保存了规范和主体之后,新的名称将出现在您的项目的 PL/SQL Packages 文件夹中。
随后您将看到如何部署和测试这个 PL/SQL 包。
编辑 PL/SQL 例程
在创建 PL/SQL 过程或例程之后,您通常编辑它以添加自己的业务逻辑。PL/SQL 过程或函数的编辑器的功能与 PL/SQL 包的编辑器类似。
PL/SQL 例程编辑器有两个选项卡。Configuration 选项卡包含模型的属性。Source 选项卡包含 PL/SQL 源。
图 31 显示了 Oracle 的 PL/SQL 过程的 Configuration 选项卡:
图 31. 查看 TEST_TIMESTAMP 的 PL/SQL 过程编辑器的 Configuration 选项卡
Configuration 选项卡上最有用的属性是表明是否为调试启用了例程的属性。您必须选择这个复选框并部署更改之后才能调试过程。
ODS 2.2 不支持调试独立的函数(PL/SQL、SQL 或 OLE DB)。
Deploy、Run 和 Debug 链接到 Deployment Configuration 部分的按钮或菜单项,以在部署和测试工作时调用正确的操作。
Parameters 和 Options 部分是可展开的。针对 PL/SQL 例程的表中的参数是不可编辑的,如图 32 所示。
图 32. 查看 PL/SQL TEST_TIMESTAMP 过程的参数
您可以编辑 Source 选项卡的内容。您可以更改例程的名称,添加、修改或删除参数名、模式和数据类型,修改函数的返回类型,以及实现例程的主体。编辑器并不验证 PL/SQL 语法,但它给语法标上颜色,如图 33 所示。
图 33. 编辑 PL/SQL 过程 TEST_TIMESTAMP 的源
将 PL/SQL 包部署到 Oracle 服务器
与可以从本地编辑和运行的 Java 应用程序不同,您必须先将 PL/SQL 包、过程和函数部署到数据库服务器之后才能运行它们。您不能在项目中运行它们,但您可以在部署之后从项目中运行它们。
当您在数据开发项目中选择一个 PL/SQL 包、过程或函数,并且从该对象的弹出窗口选择了 Deploy... 操作,如果此时您连接到与该项目相关联的数据库,那么将出现 Deploy PL/SQL Package 向导。在这个例子中,该向导以 Deploy Options 页面开始,如图 34 所示。
图 34. 为 PL/SQL 包设置部署选项
当您选择该对象文件夹,或选择单个文件夹中的多个对象,然后从弹出菜单选择了 Deploy... 操作,那么将出现 Deploy PL/SQL Package 向导。在这个例子中,该向导以 Selection 页面开始,如图 35 所示。您可以从该页面勾选单个对象,或单击 Select All。
图 35. 选择需要部署的 PL/SQL 包
Deploy 向导允许您部署一个或多个相同类型的对象。
当部署多个 PL/SQL 过程时,在 Deploy Options 页面上会出现额外的选项,如图 36 所示。
图 36.为部署多个 PL/SQL 包设置选项
您可以将所选择的对象部署到当前的数据库,即与您的项目相关联的数据库,或选择一个不同的兼容数据库作为部署目标。
您可以指定目标模式(或 Oracle 的所有者)。对于 DB2,目标模式是将用于非限定对象的 SQLID。
对于 DB2,您可以通过从这个以逗号分隔的列表中添加或删除模式来更改默认路径。
您还可决定如何处理重复的对象。默认情况下,ODS 2.2 在重新创建之前删除重复的对象,不过,如果它因对象已经存在数据库中而遇到错误,那么它可能会停止或回滚更改。
如果您的 PL/SQL 包源包含 CREATE OR REPLACE 语句,就会忽略重复处理选项,除非您删除 OR
REPLACE。对于 DB2 LUW 9.7,您可以将 OR REPLACE 添加到任何 CREATE PROCEDURE 或 CREATE FUNCTION 语句,但对于 SQL 和 Java 例程,将不忽略重复处理选项。
单击 Next > 将出现 Deploy Options 页面或 PL/SQL Package Options 页面,如图 37 所示。
图 37. 为 PL/SQL 包设置部署选项
这个页面允许您为每个部署对象更改选项。对于 PL/SQL 包,唯一的选项是是否启用调试。对于其他对象类型和数据库目标,选项会更多。
除了启用调试选项之外,在这里更改的其他选项没有保存到项目中。如果部署成功,它们就仅保存在目标数据库中。
单击 Finish 时,选择的对象将通过后台线程逐个部署。结果显示在 SQL Results 视图上。
如果部署一个以上对象,针对每个对象的操作将在 SQL Results 视图中合成组。要查看每个对象的状态,展开该组并选择一个对象,如图 38 所示。
图 38. 在 SQL Results 视图中展开部署操作
在 Oracle 上运行 PL/SQL 包
您可以在 Data Source Explorer 中运行独立的例程(不管其实现语言是什么)。在 Data Project Explorer 中,如果您能够部署部署例程,就可以运行它。当您选择一个需要运行的 PL/SQL 包时,首先会提示您在 PL/SQL 包中选择一个过程或函数。如果线程声明输入参数,还将提示您为它们提供值。
遵循以下步骤运行 CRIOLLO1.INVENTORY.QUERY_CLOSING_INVENTORY 函数:
- 右键单击名为 INVENTORY 的 PL/SQL 包。从弹出菜单选择 Run...。这时将出现 Run - CRIOLLO1.INVENTORY 对话框,如图 39 所示。
图 39. 在 PL/SQL 包中运行 QUERY_CLOSING_INVENTORY 函数
- 单击 Run。这时将出现 Specify Parameter Values 对话框。
- 输入以下参数值,如图 40 所示:
- Y =
2007
- M =
1
- W =
7
- P =
2110
图 40. 为运行 QUERY_CLOSING_INVENTORY 函数输入参数值
单击 OK。运行操作出现在 SQL Results 视图中。操作的 Result1 选项卡显示函数的返回值,如图 41 所示。
图 41. 在运行 QUERY_CLOSING_INVENTORY 函数之后查看结果
您还可使用 Data Source Explorer 或 Data Project Explorer 在 PL/SQL 包中运行例程。
在 Oracle 上调试 PL/SQL 包
ODS 2.2 为 DB2 LUW 9.7(当使用 Oracle JDBC 瘦驱动程序时)和 Oracle 10g 或 11g 提供 PL/SQL 例程调试器。
遵循以下步骤在 Oracle 上调试 PL/SQL 包:
- 当创建、编辑或部署可调试的例程时,选择 Enable debugging 复选框:

如果在部署 PL/SQL 包或例程时没有选择该选项,服务器将不生成它的调试信息。在例程编辑器中设置和保存该选项还不足以启用调试。您还必须选择该选项并部署例程。
部署名为 INVENTORY 的 PL/SQL 包。确保在 PL/SQL Package Options 页面选择 Enable debugging 复选框。
- 右键单击 INVENTORY 包。从弹出菜单选择 Debug...。与运行包相似,这时将出现
Run - CRIOLLO1.INVENTORY 对话框,并选择了以下函数:QUERY_CLOSING_INVENTORY (NUMBER,NUMBER,NUMBER,NUMBER) RETURN NUMBER
- 与运行例程时一样,输入以下参数值:
- Y =
2007
- M =
1
- W =
7
- P =
2110
-
单击 OK。
然后就询问您是否确定切换到 Debug 透视图,如图 42 所示。
图 42. 确认将切换到 Debug 透视图
-
单击 Yes。
-
Debug 透视图为您提供调试例程所需的视图。您可以根据自己的喜好排列这些视图或调整其大小:
- 在 Debug 视图中出现堆栈跟踪。这个视图的工具栏包含以下有用的按钮:
| 图标 | 按钮名(快捷方式) | 功能 |
|---|
| 恢复 (F8) | 运行例程到下一个断点或完成例程。 |  | 终止 (Ctrl+F2) | 终止例程和调试会话,不返回结果。 |  | 步入 (F5) | 调试引用的函数或当前语句调用的过程。 |  | 跳过 (F6) | 跳过引用的函数或当前语句调用的过程。 |  | 跳出 (F7) | 从步入的函数或过程返回。 |
- 断点出现在 Breakpoints 视图中。
- 例程变量及其当前值出现在 Variables 视图中。
- 源出现在例程编辑器中。
- 调试器经常会在例程的第一行停止,即使您没有设置断点。
要设置断点,在例程编辑器的左侧边缘双击,或在希望调试器停止的语句的左侧边缘右键单击,并从弹出菜单选择 Add Breakpoint。
图 43 显示在 PROCEDURE1 的第 5 行遇到断点之后的调试透视图。
图 43. 在 Debug 透视图中设置断点
-
如果您选择运行到结束,那么将出现 SQL Results 视图,它显示状态和其他结果,如图 44 所示。
图 44. 在调试之后查看状态和结果
技巧:当您编辑将要调试的 Oracle PL/SQL 包或例程时,保持 CREATE 和对象关键字在同一行上。Oracle 服务器会移除换行,直至遇到对象关键字(PACKAGE、PACKAGE BODY、PROCEDURE 或 function)。因此,如果您没有这样做,源代码中的行号将与服务器识别到的行号不一样。
在计算表达式时,一个过程可能调用另一个过程或执行一个函数。调试器允许您步入这些嵌套的调用和函数引用中。
您可以调试 PL/SQL 包中的 PL/SQL 函数,或者从位于同一个 PL/SQL 包中的 PL/SQL 过程跳到 PL/SQL 函数。您可以调试 PL/SQL 包中或独立的 PL/SQL 过程,或从调用主体跳到被调用的 PL/SQL 过程。
与 ODS 2.2 中的 SQL 和 Java 例程调试器不一样,针对 DB2 的 PL/SQL 调试器不要求您设置或启动调试会话管理器。调试会话管理器与调试器客户端集成,并且会自动启动。
为 DB2 LUW 9.7 开发 PL/SQL 对象
要为 DB2 开发 PL/SQL 包、过程或函数,所需的任务与在 Oracle 上开发一样。DB2 和 Oracle 对 PL/SQL 的支持差别很小:
- 在 Oracle 上为 PL/SQL 包、过程或函数命名时,名称(没有所有者)的最大长度为 30 个字符。在 DB2 上,名称的最大长度为 128 个字符。
- 当您为 DB2 创建独立的过程或函数时,您可以选择 PL/SQL 之外的语言(SQL 和 Java)。因此,在向导中选择实现语言的 Language 字段没有禁用,并且默认选择 SQL。
- 当您使用向导给 PL/SQL 过程或函数添加参数,或更改函数的返回类型时,针对 DB2 的数据类型列表包含 SQL 数据类型和 PL/SQL 数据类型。您可以使用,例如
INTEGER
和 INT,向导显示首选的 DB2 同义词(INTEGER)。
要了解受支持的数据类型的列表,请查看 附录 A。
- 对于 DB2,您可以为参数化数据类型指定长度、总长度或小数位数,从而限制参数的值。
- 当您在 Data Project Explorer 中创建 DB2 项目时,除了 PL/SQL packages、SQL scripts、stored procedures、user-defined functions 和 XML objects 文件夹之外,您还会看到 Web Services 文件夹,如图 45 所示。
图 45. 在 DB2 数据开发项目中的 Web Services 文件夹
与 Web Services 文件夹相关联的操作帮助您生成在 SQL 脚本中运行语句,或调用存储过程和用户定义函数的 Web 服务。
要创建 Web 服务,右键单击 Web Services 文件夹,并从弹出菜单选择 New Web Service... 启动向导。然后,您可以将 SQL 脚本和存储过程拖放到新的服务中。
您不能复制或拖动 PL/SQL 包到 Web 服务,以创建调用 PL/SQL 包中的过程的操作。要创建调用 PL/SQL 包中的过程的 Web 服务操作,首先要为另一个过程生成一个伪服务,然后编辑该操作以添加 PL/SQL 的包名作为中间限定符,例如:
TEAM.INVENTORY.TOTAL_INVENTORY_LEVELS
在创建 DB2 数据开发项目之后,您可以通过将 PL/SQL 对象从 Oracle 项目复制或拖放到 DB2 项目,然后使用 DB2 项目中的 PL/SQL 开始开发。或者在 Data Source Explorer 的 Oracle 数据库连接中复制或拖动对象。
将 PL/SQL 对象从 Oracle 项目拖放到 DB2 项目
当您为 Oracle 在数据开发项目中创建了 PL/SQL 包或独立的过程或函数之后,您可以将它们复制或拖放到另一个 Oracle 项目或 DB2 LUW 9.7 数据开发项目。
将 PL/SQL 包或独立的过程或函数部署到 Oracle 之后,您可以在 Data Source Explorer 中找到它,或将它拖放到 Oracle 或 DB2 LUW 9.7 数据开发项目中。
遵循以下步骤将 PL/SQL 对象从 Oracle 项目拖动到 DB2 项目:
- 从 Data Source Explorer 展开 Oracle 连接并找到名为 INVENTORY 的 PL/SQL 包。
- 调整工作台,以同时看到 Data Source Explorer 和 Data Project Explorer。
- 从 Data Source Explorer 将 PL/SQL 包拖动到 Data Project Explorer 中的 DB2 项目的 PL/SQL Packages 文件夹。(如果不能同时看到 Data Source Explorer 和 Data Project Explorer,您可以选择从源中复制它,然后粘贴到目标项目)。
-
当拖放操作完成之后,您可能发现不兼容问题,如图 46 所示。
图 46. 认识到项目之间可能不兼容
单击 OK。
- 通过双击打开前面已移动到 DB2 项目、名为 INVENTORY 的 PL/SQL 包,或右键单击并从弹出菜单选择 Open 打开它。
- DB2 不能使用变量声明中的
X NUMBER(38,0) 的总长度和小数位数。在编辑器的 Specification 选项卡中更改所有数据类型,以匹配 DB2 上的 INVENTORY_LEVELS 表中的类型:
CREATE OR REPLACE PACKAGE INVENTORY
AS
FUNCTION QUERY_CLOSING_INVENTORY(
Y SMALLINT,
M SMALLINT,
W INTEGER,
P INTEGER
)
RETURN INTEGER;
END INVENTORY;
|
- 在 Body 选项卡进行相应的修改:
CREATE OR REPLACE PACKAGE BODY INVENTORY
AS
FUNCTION QUERY_CLOSING_INVENTORY(
Y SMALLINT,
M SMALLINT,
W INTEGER,
P INTEGER
)
RETURN INTEGER
AS
X INTEGER;
BEGIN
SELECT CLOSING_INVENTORY INTO X
FROM INVENTORY_LEVELS
WHERE INVENTORY_YEAR = Y
AND INVENTORY_MONTH = M
AND WAREHOUSE_BRANCH_CODE = W
AND PRODUCT_NUMBER = P;
RETURN X;
END;
END INVENTORY;
|
- 如果您拖动的 PL/SQL 对象包含字符数据类型,那么在编辑数据类型时要记得添加最大字符串长度。对于 Oracle,
CHAR 的默认长度为 2000。对于 DB2,CHAR 的默认长度为 1。
- 通过按下 Ctrl+S 或从编辑器的弹出菜单或在主菜单上选择 File -> Save 保存更改。这样就同时保存了规范和主体。
在 DB2 上进行部署、运行和调试
在 DB2 上部署、运行和调试 PL/SQL 包和例程与在 Oracle 上执行这些任务相似,或与在 DB2 上为 SQL 和 Java 例程执行这些任务相似。
遵循以下步骤部署、运行和调试 PL/SQL Package 向导,以创建 PL/SQL 包:
- 当您在数据开发项目中选择一个 PL/SQL 包、过程或函数,并且从弹出菜单选择了 Deploy... 操作时,如果您连接到与该项目相关联的数据库,那么将出现 Deploy PL/SQL Package 向导,如图 47 所示。
图 47. 为 PL/SQL 包选择选项以部署到 DB2
在第二个组中(Target schema...),Default path 字段仅对 DB2 显示。该字段不对 Oracle 显示。
仅当您选择通过该操作部署一个以上的 PL/SQL 包时,这个页面才会出现第三个组(Error handling)。
- 在开发期间,在 Deploy 向导的 PL/SQL Package Options 页面勾选 Enable debugging 复选框是一个良好实践,这能让 DB2 在编译对象时提供调试信息。
-
单击 Finish。选择的对象将通过一个后台线程依次部署。最后结果显示在 SQL Results 视图中。
- 您可以在 Data Source Explorer 中运行独立的例程(不管它是用什么语言实现的)。如果您能够在 Data Project Explorer 中部署它,那么就可以运行它。如果例程声明了输入参数,那么将提示您为它们提供值。
-
数据库服务器将规范化显示在 run 对话框中的参数数据类型。DB2 将特定于 PL/SQL 的数据类型规范化为等效的 SQL 类型。例如,BINARY_INTEGER 在 DB2 数据库上被储存为 INTEGER。
- 您还可以在 Data Source Explorer 或 Data Project Explorer 的 PL/SQL 包中运行例程。
-
ODS 2.2 为 DB2 LUW 9.7 提供一个 PL/SQL 例程调试器。与 ODS 2.2 中的 SQL 和 Java 例程调试器不同,针对 DB2 的 PL/SQL 调试器不需要您设置或启动调试会话管理器。调试会话管理器与调试器客户端集成,并且会自动启动。
指定长型或二进制输入值
Specify Parameter Values 对话框提供额外功能来指定和导入大字符串、二进制和 XML 值。您可以在参数的最右列单击省略号按钮,然后在第二个对话框中编辑单元格,如图 48 所示。
图 48. 单击省略号按钮来指定长型值
您可以在表的单元格中输入数字或字符串值。对于字符串值,不需要输入字符串分隔符(例如,您应该输入 my value 而不是 'my value')。
要为字符串值传递 NULL(以区分 NULL 和空字符串),单击 Set to NULL。将显示伪值 *NULL*,并且 NULL 被传递到例程。
如果出现省略号按钮,您可以单击它从更大的对话框中编辑值。
对于 XML 数据类型,单击 Browse... 选中一个 XML 文件,然后在 XML Tree 选项卡中查看它,如图 49 所示。
图 49. 为输入参数选中一个 XML 文档
对于二进制数据类型,您必须输入不带分隔符的十六进制字符串。通过 Browse... 选择的任何文件都被转换成十六进制,如图 50 所示。
图 50. 为输入参数选择一个二进制文件
数据库服务器将规范化显示在 run 对话框中的参数数据类型。DB2 服务器将特定于 PL/SQL 的数据类型规范化为等效的 SQL 类型。Oracle 服务器将子类型规范化为它们的基类型。例如,INT 在 Oracle 数据库上被存储为 NUMBER,因此 run 对话框显示 NUMBER 而不是 INT。
编程细节
在 PL/SQL 中使用 CURSOR 类型
就像 DB2 中的原生 SQL 过程一样,PL/SQL 过程并没有隐式地返回所有打开的游标。所以,您需要声明一个类型为 CURSOR 或 REF CURSOR(比如 SYS_REFCURSOR)的 OUT 参数,并通过数据库查询打开它。该输出值被 JDBC 应用程序作为结果集接收。
例如,对于 Oracle 上的 PL/SQL 过程:
CREATE OR REPLACE PROCEDURE TEST_SYSREFCURSOR (
cursor_1 OUT SYS_REFCURSOR )
AS
BEGIN
OPEN cursor_1 FOR SELECT OBJECT_NAME
FROM USER_PROCEDURES
WHERE OBJECT_NAME LIKE 'SP0%';
END;
|
要允许调用程序处理游标,您必须让它保持打开。
控制流
PL/SQL 例程的主体包含在 PL/SQL 块中,它以 BEGIN 开始并以 END 结束,而且后面可以附上例程的名称。
在 PL/SQL 例程的主体,您可以使用序列、遍历和选择控制结构。
IF (condition) THEN...[ELSEIF (condition) THEN...][ELSE...] END IF;
CASE condition WHEN value THEN...[WHEN value THEN...] ELSE...END CASE;
FOR counter IN range LOOP...END LOOP;
WHILE condition LOOP...END LOOP;
WHILE...EXIT WHEN condition;
|
另外,PL/SQL 允许您在块的末尾编写一个异常处理程序:
EXCEPTION
WHEN exception-name THEN ...
[WHEN exception-name THEN ...]
|
查看 Oracle Database 2 Day Developer's Guide 的 “Handling Errors and Exceptions”,它列出了常见的异常名。在 参考资料 部分提供了该指南的链接。
此外,您还可以声明定制的异常:
exception-name EXCEPTION;
IF condition THEN RAISE exception-name;
|
命名约定
对于 PL/SQL,在命名时基本上可以遵循 SQL 标准。Oracle 对象的名称的最大长度为 30 个字符,但数据库名除外,它的最大长度为 8 个字符。
在 SQL 或 PL/SQL 语句中,常规的 SQL 标识符可以不使用空格或特殊字符。数据库服务器将这些名称转换成大写的,实际上导致它们对大小写敏感。
在 SQL 或 PL/SQL 中,带有空格、特殊符号或使用了小写的名称必须用双引号分隔。这些分隔符并不存储在数据库目录中。
下面这个方案给出两种命名格式:
| SQL 格式 | 目录格式 |
|---|
myName | MYNAME | MYNAME | MYNAME | "myName" | myName | "my.name" | my.name |
在 ODS 2.2 中,您可以看到 Data Source Explorer 中出现目录格式的 SQL 名称,或 Data Project Explorer 中出现 SQL 格式的 SQL 名称。
可以对 PL/SQL 包和独立例程的名称进行限定。在 DB2 中,限定符是一个模式名,而模式名也是一个 SQL 标识符。在 Oracle 中,限定符是一个所有者的名称。简单的对象名称与它前面的限定符之间用点号分隔:
PL/SQL 包要复杂一些,因为包是数据库模式的成员,而不是包中的例程。要测试包中的例程,您可以在 CALL 语句中使用包名限定例程名:
CALL "mySchema"."myPackage"."myName"();
|
Oracle 引入了另一种命名格式,ODS 2.2 不支持该格式:远程名称。远程名称在简单的名称之后附带另一个数据库的名称,它们之间用 @ 符号分隔:
CALL "mySchema"."myPackage"."myName"@otherDB();
|
限制
- 并不是所有 PL/SQL 功能都受 ODS 2.2 支持:
- 查看 附录 A 数据类型表了解不支持的数据类型。
- 对于 DB2,必须为例程参数声明参数化数据类型的长度、总长度和小数位数。
- 对于以下产品版本,IBM 不支持 PL/SQL 语句的编译和执行:
- DB2 Express
- DB2 Express-C
- DB2 Personal Edition
- DB2 不允许您在分区数据库环境中创建 PL/SQL 函数和触发器。
- 对于 DB2,函数、过程、触发器或匿名块中不支持
TYPE 声明。
- 对于 DB2,
FOR EACH STATEMENT 选项不支持 PL/SQL 触发器。
- 在 DB2 中,SQL 和 Java 例程支持的功能 PL/SQL 不一定支持:
- 没有针对 PL/SQL 对象的导出功能或命令行部署。
- 没有 DB2 SQL 过程中的错误处理代码。
- 在创建 PL/SQL 存储过程时,您不能在向导中添加 SQL 语句。向导生成的代码并不基于您指定的数据库访问,但是受到参数声明的限制。
- 在 SQL 编辑器或例程编辑器中没有针对 PL/SQL 的内容帮助。
- 不支持 Run Settings。
- 没有为 PL/SQL 包、过程或函数提供导入向导。
- 不能将 PL/SQL 包拖放到 Web 服务中,以创建调用 PL/SQL 包中的过程的操作。
- 并不是所有 DB2 或 Oracle 功能都受 ODS 2.2 支持:
- 对于 Oracle,不能在数据开发项目中开发 Java 函数。
- 在数据开发项目中不能开发触发器,但是您可以在 SQL 编辑器的 SQL 脚本中运行
CREATE TRIGGER 语句。
- 在数据开发项目中不支持 DB2 模块。
- 在 Oracle 上不支持远程名称。
- ODS 2.2 不使用 Outline 视图来显示 PL/SQL 包中的例程。
- 不能将独立的例程从一个项目或数据库复制或拖放到项目的 PL/SQL 包中。不能将 PL/SQL 包中的例程(从项目或从数据库)拖放到 Stored Procedures 或 User-Defined Function 文件夹。
- 在不进行编辑的情况下,功能差异可能阻止在 Oracle 和 DB2 数据库之间复制对象。如果特定的限制不受支持(例如引擎不支持),但仍然能够创建该限制,那么可以创建它。这时会在 SQL Results 视图中发出一个警告。如果根本不能创建限制,将发出一个错误。
- ODS 2.2 复制 PL/SQL 对象时并没有根据目标项目转换它们。如果 Oracle PL/SQL 包、过程或函数包含 DB2 不支持的语法或功能,那么 ODS 2.2 就不能成功部署该复制对象。必须解决问题之后才能成功部署 PL/SQL 对象。
- 不能使用 Data Object 编辑器创建
BIGFILE 表空间;不过,您可以使用 Open with SQL 编辑器菜单操作编辑生成的 DDL,以及添加关键字 BIGFILE。
- 现有的 SQL 解析器不支持 PL/SQL。在 ODS 2.2 中,解析器用于在编辑器中即时计算源代码、用于导入、以及用于在向导中解释 SQL 语句。这个发布版中没有包含 PL/SQL 解析器;因此编辑器受到以下限制:
- PL/SQL 编辑器不提供内容帮助或标记错误。例程编辑器的语法验证默认关闭;不过,在 SQL 脚本编辑器中,编辑包含 PL/SQL 的脚本时,必须从编辑器菜单取消选择 Validate Statement Syntax 复选框。
- PL/SQL 包编辑器不在规范和主体之间同步更改。
- 要删除 PL/SQL 包中的例程,必须编辑 PL/SQL 包,并从规范和主体中删除该例程。
- 不能在编辑器的 Configuration 选项卡更新独立 PL/SQL 例程的参数。
- PL/SQL 过程向导不包含 SQL 语句页面。
- 尽管 PL/SQL 函数向导中有一个 SQL 语句页面,但它并不从 SQL 语句或表达式确定返回类型,也不提供 Import、Validate 或 Create SQL 按钮。
- 调试 PL/SQL 例程有以下限制:
- 调试 PL/SQL 例程需要一个使用 Oracle Thin JDBC 驱动程序的连接。
- 仅能调试位于 PL/SQL 包中的 PL/SQL 函数。不能调试任何独立的函数,不管其实现语言是什么。
- 在调试时不能更新 LOB 元素(LOB 变量、在行变量中的 LOB 字段、数组变量中的 LOB 元素)。
- 调试器仅显示 LOB 值的前 32 K 字节。
- 调试器不支持一组行。

 |

|
附录 A. 支持的数据类型
下面的表列出了 ODS 2.2 针对 DB2 LUW 9.7 和 Oracle 10g
and 11g 支持的数据类型。如果数据类型受支持,那么您就可以在向导中为参数或返回类型选择第一个同义词,或在例程编辑器中输入它们的同义词之一。
| 来自 DB2 9.7 数据库定义并且受 ODS 2.2 支持的 PL/SQL 和 DB2 数据类型(粗体表示该类型仅出现在 DB2 中) | 来自 Oracle 数据库定义并且受 ODS 2.2 支持的 PL/SQL 数据类型(粗体表示该类型仅出现在 PL/SQL 中) |
|---|
BIGINT
BINARY_INTEGER
BLOB
CHAR, CHARACTER
CHAR FOR BIT DATA, CHARACTER FOR BIT DATA
CLOB, CHARACTER LARGE OBJECT,
CHAR LARGE OBJECT
CURSOR
1
DATE
2
DBCLOB
DECFLOAT
DECIMAL, DEC
DOUBLE, DOUBLE PRECISION
FLOAT
GRAPHIC
INTEGER, INT
LONG RAW
NCHAR, NATIONAL CHARACTER, NATIONAL CHAR
NCLOB
3
NUMBER
4
NUMERIC, NUM
NVARCHAR2, NATIONAL CHARACTER VARYING,
NATIONAL CHAR VARYING, NCHAR VARYING
PLS_INTEGER
RAW
REAL
SMALLINT
SYS_REFCURSOR, REFCURSOR,
REF CURSOR
1
TIME
TIMESTAMP
VARCHAR, CHARACTER VARYING, CHAR VARYING
VARCHAR FOR BIT DATA, CHARACTER VARYING FOR BIT DATA,
CHAR VARYING FOR BIT DATA
VARCHAR2
5
VARGRAPHIC
|
BINARY_DOUBLE
BINARY_FLOAT
BINARY_INTEGER
CHAR, CHARACTER
DATE
DECIMAL, DEC
DOUBLE PRECISION
FLOAT
INT, INTEGER
LONG RAW
NATURAL
NUMBER
NUMERIC
PLS_INTEGER
POSITIVE
RAW
REAL
ROWID
SIGNTYPE
SMALLINT
STRING
SYS_REFCURSOR, REFCURSOR,
REF CURSOR
1
TIMESTAMP
TIMESTAMP WITH LOCAL TIME ZONE
6
TIMESTAMP WITH TIME ZONE
VARCHAR2, CHARACTER VARYING,
CHAR VARYING, VARCHAR
|
下面是 ODS 2.2 不支持的数据类型。
| DB2 不支持的 PL/SQL 数据类型 | Oracle 不支持的 PL/SQL 数据类型 |
|---|
BINARY_DOUBLE
BINARY_FLOAT
BOOLEAN (JCC does not support BOOLEAN for PL/SQL)
BFILE
INTERVAL
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
LONG
NATURALN
POSITIVE
POSITIVEN
ROW
SIGNTYPE
SIMPLE_INTEGER
STRING
TABLE
TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP WITH TIME ZONE
VARRAY
XMLTYPE
|
BFILE
7
BLOB
7
BOOLEAN, PL/SQL BOOLEAN
CLOB
7
INTERVAL
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
LONG
NATURALN
8
NCHAR,
NATIONAL
CHARACTER,
NATIONAL CHAR
NCLOB
7
NVARCHAR2,
NATIONAL CHARACTER VARYING,
NATIONAL CHAR VARYING, NCHAR VARYING
POSITIVEN
8
ROW
SIMPLE_INTEGER
8
TABLE
UROWID
VARRAY
XMLTYPE
7
|
注意:
SYS_REFCURSOR 和 CURSOR 仅在 OUT 参数上受支持(从另一个例程传递值除外)。PL/SQL 用户定义函数必须拥有标量返回值;因此,这些数据类型不能用于 PL/SQL 用户定义函数。
- 当为
DATE 数据类型设置了 DB2_COMPATIBILITY_VECTOR 注册表变量时,DATE 等效于 TIMESTAMP (0)。
- 当数据库没有定义为 Unicode 数据库时,PL/SQL 语句或 PL/SQL 上下文不支持
NCLOB 数据类型。在 Unicode 数据库中,NCLOB 数据类型被映射到 DB2 DBCLOB 数据类型。
- 当 number_compat 数据库配置参数设置为
ON 时,DB2 上的 SQL 支持 NUMBER。
- 当
varchar2_compat 数据库配置参数设置为 ON 时,DB2 上的 SQL 支持 VARCHAR2。
TIMESTAMP WITH LOCAL TIME ZONE 不能作为 UDF 返回类型。
- 不对 Oracle 支持
BFILE、SIMPLE_INTEGER、BLOB、CLOB、NCLOB 和 XMLTYPE,因为 ODS 不能访问 Oracle 驱动程序所需的包装器类。
NATURALN、POSITIVEN 和 SIMPLE_INTEGER 带有 NOT NULL 限制的 PLS_INTEGER 的子类型。这阻止您将它们用作 OUT 参数。ODS 2.2 没有在创建例程参数中列出它们,但是您可以在编辑器中将它们用作 IN 或 IN OUT。
除了以上的限制之外,Data Studio 也不支持以下的 Oracle 数据类型:
- 用户定义类型
- Object types
- REF nested tables
- 任意类型之一
ANYTYPE
ANYDATA
ANYDATASET
- XML 类型
- URI data types
- URIFactory package
- 空间类型
SDO_GEOMETRY
SDO_TOPO_GEOMETRY
SDO_GEORASTER
SI_Texture
SI_FeatureList
- 媒体类型
ORDAudio
ORDImage
ORDImageSignature
ORDVideo
ORDDoc
SI_StillImage
SI_Color
SI_AverageColor
SI_ColorHistogram
SI_PositionalColor
数据类型限制:
- ODS 2.2 不支持 PL/SQL 集合数据类型(
ROW 和 VARRAY),但 CURSOR 除外。您仅可以为 PL/SQL 函数声明标量返回类型。
- 在将数据从 Oracle 复制到 DB2 时,某些数据类型会带来限制。在这个发布版中,不能复制以下 Oracle 类型的数据:
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP (fractional-seconds-precision)
RAW
BFILE
XML
INTERVAL(在 DB2 服务器上不受支持)
NUMBER (4, -1) [其中小数位数为负数]
NUMBER (5,10) [其中总长度小于小数位数]
- 用户定义类型
ROW and ARRAY(复合类型)
- 在 Oracle 上,
BLOB 或 CLOB 的最大长度可达 4 GB,但 DB2 和 ODS 2.2 仅能处理 2 GB 的 LOB。更长的 LOB 将被截去多余部分。
- 将数据从 DB2 复制到 Oracle 时,可能需要截短数据:
- DB2
DECFLOAT 支持的范围比 Oracle 二进制 FLOAT 大。
- DB2
TIMESTAMP 支持更大的总长度(尽管在这里不能使用,因为 java.sql.Timestamp 将分数秒总长度限制为 9)。
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Thomas Sharp 出生于美国,获得斯坦福大学英语专业的博士学位。他在 IBM 担任技术作家和工程师长达 25 年,并且在例程工具和用户界面技术方面持有 18 项专利。 |
对本文的评价
|