在Oracle Developer/2000 中 调 用Windows API 函 数
---- Oracle Developer/2000 是Oracle 的 微 机 开 发 工 具, 由 于 它 与Oracle 数 据 库 的 紧 密 连 接, 比 用Power Builder 或 其 它 高 级 语 言 采 用ODBC 与Oracle 的 连 接 享 有 得 天
独 厚 的 优 点, 越 来 越 在Windows95 和WindowsNT 平 台 上 得 到 广 泛 应 用, 笔 者 在 用 其 进 行 程 序 设 计 时 感 到, 既 然 是 在Windows 平 台 上 开 发 程 序, 如 果 能 在 其 中 应 用 一 些Windows API 函 数, 将 使Developer/2000 有 如 虎 添 翼 的 感 觉, 可 以 大 大 弥 补 它 与 底 层 操 作 系 统 的 联 系 能 力 差、 控 制 实 时 硬 件 设 备 功 能 差 的 缺 点, 开 发 出 集 成 性 更 好 的 应 用 程 序。
---- 所 有 用 第 三 方 语 言 编 写 的 子 程 序 对Developer/2000 都 称 为 外 部 函 数,Windows API 函 数 也 是 外 部 函 数。 这 些 外 部 函 数 必 须 包 含 在 一 个 动 态 库 中。
例 如WINDOWS 操 作 系 统 下 的 动 态 链 接 库 或UNIX 系 统 下 的 共 享 库 等。Developer/2000 通 过 为 每 一 个 外 部 函 数 产 生 一 个PL/SQL 接 口, 它 使 用PL/SQL 的 语 法, 在 程 序 中 调 用 这 一 接 口 程 序 就 可 以 激 活 这 一 外 部 函 数。
---- 对 一 个 外 部 函 数 产 生 一 个PL/SQL 接 口, 需 要 用 到 内 建 软 件 包ORA-FFI, 它 包 含 一 些PL/SQL 的 子 程 序 用 来 对 外 部 函 数 生 成PL/SQL 接 口, 实 际 操 作 时 可 以 用Procedure Builder 产 生 一 个 程 序 库, 在 程 序 库 中 建 立 一 个 程 序 包(Package),
在 这 个 包 中 实 现 对 外 部 函 数 建 立 连 接。 下 面 介 绍 这 一 过 程 的 具 体 步 骤:
---- 1. 初 始 化 外 部 函 数
---- 就 是 说 明 包 含 外 部 函 数 的 动 态 链 接 库 的 位 置, 并 从 中 分 离 出 外 部 函 数 的 原 型, 并 将 外 部 函 数 中 主 语 言 的 数 据 类 型 和PL/SQL 数 据 类 型 做 一 一 对 应 的 匹 配。 这 是 在 包 体(Package Body) 中 进 行 的。 具 体 分 以 下 几 步:
---- (1) 用OQA_FFI.LOAD_LIBRARY 得 到 包 含 外 部 函 数 的 动 态 链 接 库 的 库 柄, 此 时 需 提 供 动 态 链 接 库 的 名 字 和 位 置。
---- (2) 用ORA_FFI.REGISTER_FUNCTION 得 到 外 部 函 数 的 函 数 柄, 这 时 需 提 供 动 态 链 接 库 的 库 柄 和 外 部 函 数 名。
---- (3) 用ORA_FFI.REGISTER_PARAMETER 来 注 册 外 部 函 数 的 参 数 类 型, 对 每 一 个 参 数 都 要 提 供 它 的 外 部 函 数 柄 和 相 应 的PL/SQL 数 据 类 型。 参 数 注 册 的 顺 序 必 须 与 它 们 出 现 在 外 部 函 数 原 型 中 的 顺 序 一 致。
---- (4) 用ORA_FFI.REGISTER_RETURN 来 注 册 外 部 函 数 的 返 回 值 类 型, 这 时 需 要 提 供 它 的 外 部 函 数 柄 和 相 应 的PL/SQL 数 据 类 型。
---- 2. 将 外 部 函 数 和 一 个PL/SQL 子 程 序 相 关 联
---- 一 个 和 外 部 函 数 建 立 关 联 的PL/SQL 子 程 序, 实 际 上 指 明 了 外 部 函 数 的 内 存 地 址, 每 次 调 用 这 个 子 程 序, 实 际 上 是 调 用 与 它 相 对 应 的 外 部 函 数。
具 体 步 骤 为:
---- (1) 用ORA_FFI.FIND_FUNCTION 或ORA_FFI.REGISTER_FUNCTION 得 到 一 个 函 数 柄。
---- (2) 在PL/SQL 包 体 的 声 明 部 分, 定 义 一 个PL/SQL 子 程 序, 它 的 第 一 个 参 数 是 类 型 为ORA_FFI.FUNCHANDLETYPE, 接 下 来 是 依 次 对 应 外 部 函 数 参 数 的PL/SQL 数 据 类 型 的 参 数。
---- (3) 在 这 个PL/SQL 子 程 序 中 加 入 一 个PRAGMA 接 口。 PRAGMA 声 明 就 是 通 过 将 控 制 转 到 一 个 内 存 地 址, 来 激 活 这 个 外 部 函 数。
---- 3. 生 成 一 个 模 仿 外 部 函 数 的 原 型 的PL/SQL 子 程 序。
---- 这 个 子 程 序 就 是 用 户 可 见 的 外 部 函 数 的PL/SQL 接 口, 用 户 按 照 它 的 参 数 类 型 和 返 回 值 类 型 来 使 用 外 部 函 数, 具 体 步 骤 为:
---- (1) 在 包 体 的 声 明 部 分, 定 义 一 个PL/SQL 子 程 序, 它 的 参 数 和 返 回 值 是 和 外 部 函 数 对 应 的PL/SQL 类 型。 这 就 是 模 仿 外 部 函 数 原 型 的 一 个 子 程 序。
---- (2) 在 这 个 子 程 序 中 调 用 与 上 步 生 成 的 与 外 部 函 数 相 关 联 的PL/SQL 子 程 序。
---- (3) 在PL/SQL 包 的 说 明(Package Spefication) 部 分, 输 入 这 个PL/SQL 子 程 序 的 原 型。
---- 下 面 是 一 个 完 整 的 为Windows API 函 数winexec 建 立PL/SQL 接 口 的 例 子:
PACKAGE WinExec IS
FUNCTION WinExec(Execfile IN VARCHAR2,
command IN PLS_INTEGER)
RETURN PLS_INTEGER;
END; /*在包说明部分,是模仿外部
函数原型的PL/SQL函数原型说明*/
PACKAGE BODY WinExec IS
lh_USER ora_ffi.libHandleType; /*定义库柄类型变量*/
fh_WinExec ora_ffi.funcHandleType; /*定义函数柄类型变量*/
FUNCTION i_WinExec(funcHandle IN ora_ffi.funcHandleType,
Execfile IN OUT VARCHAR2,
command IN PLS_INTEGER)
RETURN PLS_INTEGER;
PRAGMA INTERFACE(C,i_WinExec,11265);
/*步骤2将一个PL/SQL子程序与外部函数相关联*/
FUNCTION WinExec(Execfile IN VARCHAR2,
command IN PLS_INTEGER)
RETURN PLS_INTEGER
IS
execfile_l VARCHAR2(512) := Execfile;
rc PLS_INTEGER;
BEGIN
rc := i_WinExec(fh_WinExec,
execfile_l,
command);
RETURN (rc);
END ;
/*步骤3中PL/SQL模仿函数的定义,
它实际上就是调用步骤2中与外部函数建立关联的那个函数*/
BEGIN
BEGIN
lh_USER := ora_ffi.find_library('Kernel32.dll');
EXCEPTION WHEN ora_ffi.FFI_ERROR THEN
lh_USER := ora_ffi.load_library(NULL,'kernel32.dll');
END ; /*得到动态链接库的库柄*/
fh_WinExec := ora_ffi.register_function
(lh_USER,'WinExec', ora_ffi.PASCAL_STD);
/*得到外部函数的函数柄*/
ora_ffi.register_parameter(fh_WinExec,
ORA_FFI.C_CHAR_PTR); /*参数注册,原类型为LPCSTR */
ora_ffi.register_parameter(fh_WinExec,
ORA_FFI.C_INT); /*参数注册,原类型为UINT */
ora_ffi.register_return(fh_WinExec,
ORA_FFI.C_INT); /*返回值注册,原类型为BOOL */
END WinExec;
---- 可 以 将 多 个 外 部 函 数 的PL/SQL 接 口 放 在 一 个 包 内。 要 在Developer/2000 的
Form Designer 中 使 用 这 些 外 部 函 数, 只 要 把 包 含 这 一 程 序 包 的 程 序 库(.PLL)
附 加 进 来, 使 用 包 名. 函 数 名 就 可 激 活 这 个 外 部 函 数。
---- 例 如:WinExec.WinExec('c:\windows\notepad.exe', 0)
---- 具 体Windows API 函 数 数 据 类 型 和PL/SQL 数 据 类 型 的 转 换 可 参 照
Developer/2000 中Procedure Builder 帮 助 文 件 中 对ORA_FFI 软 件 包 的 详 细 介 绍。
分享到:
相关推荐
oci.dll文件在Oracle客户端或连接到Oracle数据库的应用程序中起着至关重要的作用,它提供了API(应用程序编程接口)供开发者用来构建与Oracle数据库交互的应用程序。 Oracle 12c Release 2 (12cR2) 是该版本的第二...
oci.dll是Oracle Call Interface (OCI) 库文件,它是Oracle数据库API的重要组成部分,用于在C/C++等编程语言中与Oracle数据库进行交互。当描述中提到"oci.dll库",意味着这个压缩包包含了这个关键组件,使得开发者或...
“oci.dll加载失败”是用户在尝试使用PL/SQL Developer或其他依赖oci.dll的Oracle工具时常见的问题。oci.dll是Oracle Call Interface (OCI) 的动态链接库,是Oracle数据库API的核心部分,用于在应用程序和数据库之间...
在本场景中,可能需要在Navicat中设置OCI连接,这意味着你需要配置oci.dll文件的位置,以便Navicat能够识别并使用它来连接Oracle数据库。oci.dll是Oracle客户端的动态链接库,包含了与数据库通信所需的所有函数。 5...
本压缩包"Instantclient-basic-win32-10.2.0.5"是专为32位Windows系统设计的版本,其主要目标是解决PL/SQL Developer等应用程序在运行时无法识别oci.dll文件的问题。 oci.dll是Oracle Call Interface (OCI) 的动态...
"oraociei10.dll" 是Oracle 数据库连接的一个关键组件,主要用于在没有完整安装Oracle客户端的情况下,通过PL/SQL Developer等工具连接到远程Oracle数据库。这个动态链接库(DLL)文件是Oracle Instant Client的一...
在Oracle 12中,oci.dll扮演着核心角色,它提供了API接口,允许开发者用各种编程语言(如C、C++等)编写程序来访问和操作Oracle数据库。这个dll文件包含了执行SQL语句、处理结果集、事务控制、游标管理、存储过程...
在"PLSQL Developer 官方最新版及 oracle官方64位客户端-instantclient-basic-windows.x64-12.2.0.1.0"这个压缩包中,包含了以下关键组件: 1. PLSQL Developer 12.0.2:这是PLSQL Developer的最新版本,它提供了更...
在使用Navacat工具连接Oracle数据库时,可能会遇到“ORA-12737: Instant Client Light: unsupported server character set ZHS16GBK”的错误。这个错误信息表明Navacat在尝试建立连接时,发现Oracle服务器使用的字符...
3. **PL/SQL Developer**:提到“可结合plsql使用”,意味着此客户端可以与PL/SQL Developer这样的集成开发环境(IDE)配合,用于编写、调试和管理PL/SQL代码,这是Oracle数据库的面向过程的编程语言。 4. **Oracle...
"绿色版"Oracle 10G是指无需正式安装,可以直接使用的版本,通常是为了方便那些不希望在计算机上完整安装客户端,但仍需进行数据库操作,如使用PL/SQL Developer等工具的用户。 在提供的文件列表中,我们可以看到...
Oracle Instant Client是Oracle公司提供的一款轻量级的数据库连接工具,主要用于在不安装完整Oracle数据库服务器的情况下,使得应用程序能够连接到Oracle数据库。标题"oracle-instantclient-basic-windows.x64-12.1....
在IT行业中,数据库管理是至关重要的任务之一,而Oracle数据库作为全球广泛使用的数据库管理系统,其高效性和稳定性备受赞誉。在不安装完整Oracle客户端的情况下,我们可以借助特定的工具和组件来与Oracle数据库进行...
在64位环境中,使用正确的oci.dll文件至关重要,因为它包含了一组API函数,这些函数允许应用程序创建、管理并执行SQL语句,处理游标,以及进行事务控制等。 Oracle Instant Client是一个轻量级的客户端解决方案,它...
在描述中提到的“使用instantclient_11_2和pl/sql Developer连接oracle远程数据库”,表明了两个关键组件:Oracle Instant Client 11.2和PL/SQL Developer。PL/SQL Developer是一款专门用于编写、调试和管理PL/SQL...
本文将基于"oracle_commond.rar_odbc api_oracle_oracle 客户端_oracle sql_sql"这一主题,深入探讨Oracle数据库的相关知识,包括ODBC API、Oracle客户端工具以及SQL在Oracle中的应用。 1. ODBC API(Open Database...
Oracle Instant Client是Oracle公司提供的一款轻量级数据库连接软件,主要功能是允许应用程序在无需完整安装Oracle Database的情况下,与Oracle数据库进行通信。标题中的"instantclient-basic-windows.x64-12.1....
4. ociw32.dll:这个文件提供了Oracle在Windows平台上的特定功能,如窗口处理和线程管理,是Oracle客户端在Windows环境下运行所必需的。 5. ocijdbc10.dll:这是Oracle JDBC驱动的动态链接库,用于Java应用程序通过...
- 设置PATH环境变量:将Oracle Instant Client的路径添加到系统的PATH环境变量中,这样PLSQL Developer就可以找到必要的DLL文件。例如,添加"C:\Oracle\InstantClient_10_2"。 - 定义TNS_ADMIN环境变量:创建一个...