知识大全 在Oracle Developer/2000 中 调 用Windows API 函 数

Posted 函数

篇首语:敏而好学,不耻下问。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 在Oracle Developer/2000 中 调 用Windows API 函 数相关的知识,希望对你有一定的参考价值。

在Oracle Developer/2000 中 调 用Windows API 函 数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  作者 王 莹( 山 东 工 业 大 学 硕 士 研 究 生)     Oracle Developer/ 是Oracle 的 微 机 开 发 工 具 由 于 它 与Oracle 数 据 库 的 紧 密 连 接 比 用Power Builder 或 其 它 高 级 语 言 采 用ODBC 与Oracle 的 连 接 享 有 得 天 独 厚 的 优 点 越 来 越 在Windows 和WindowsNT 平 台 上 得 到 广 泛 应 用 笔 者 在 用 其 进 行 程 序 设 计 时 感 到 既 然 是 在Windows 平 台 上 开 发 程 序 如 果 能 在 其 中 应 用 一 些Windows API 函 数 将 使Developer/ 有 如 虎 添 翼 的 感 觉 可 以 大 大 弥 补 它 与 底 层 操 作 系 统 的 联 系 能 力 差 控 制 实 时 硬 件 设 备 功 能 差 的 缺 点 开 发 出 集 成 性 更 好 的 应 用 程 序      所 有 用 第 三 方 语 言 编 写 的 子 程 序 对Developer/ 都 称 为 外 部 函 数 Windows API 函 数 也 是 外 部 函 数 这 些 外 部 函 数 必 须 包 含 在 一 个 动 态 库 中 例 如WINDOWS 操 作 系 统 下 的 动 态 链 接 库 或UNIX 系 统 下 的 共 享 库 等 Developer/ 通 过 为 每 一 个 外 部 函 数 产 生 一 个PL/SQL 接 口 它 使 用PL/SQL 的 语 法 在 程 序 中 调 用 这 一 接 口 程 序 就 可 以 激 活 这 一 外 部 函 数      对 一 个 外 部 函 数 产 生 一 个PL/SQL 接 口 需 要 用 到 内 建 软 件 包ORA FFI 它 包 含 一 些PL/SQL 的 子 程 序 用 来 对 外 部 函 数 生 成PL/SQL 接 口 实 际 操 作 时 可 以 用Procedure Builder 产 生 一 个 程 序 库 在 程 序 库 中 建 立 一 个 程 序 包(Package) 在 这 个 包 中 实 现 对 外 部 函 数 建 立 连 接 下 面 介 绍 这 一 过 程 的 具 体 步 骤      初 始 化 外 部 函 数      就 是 说 明 包 含 外 部 函 数 的 动 态 链 接 库 的 位 置 并 从 中 分 离 出 外 部 函 数 的 原 型 并 将 外 部 函 数 中 主 语 言 的 数 据 类 型 和PL/SQL 数 据 类 型 做 一 一 对 应 的 匹 配 这 是 在 包 体(Package Body) 中 进 行 的 具 体 分 以 下 几 步      ( ) 用OQA_FFI LOAD_LIBRARY 得 到 包 含 外 部 函 数 的 动 态 链 接 库 的 库 柄 此 时 需 提 供 动 态 链 接 库 的 名 字 和 位 置      ( ) 用ORA_FFI REGISTER_FUNCTION 得 到 外 部 函 数 的 函 数 柄 这 时 需 提 供 动 态 链 接 库 的 库 柄 和 外 部 函 数 名      ( ) 用ORA_FFI REGISTER_PARAMETER 来 注 册 外 部 函 数 的 参 数 类 型 对 每 一 个 参 数 都 要 提 供 它 的 外 部 函 数 柄 和 相 应 的PL/SQL 数 据 类 型 参 数 注 册 的 顺 序 必 须 与 它 们 出 现 在 外 部 函 数 原 型 中 的 顺 序 一 致      ( ) 用ORA_FFI REGISTER_RETURN 来 注 册 外 部 函 数 的 返 回 值 类 型 这 时 需 要 提 供 它 的 外 部 函 数 柄 和 相 应 的PL/SQL 数 据 类 型      将 外 部 函 数 和 一 个PL/SQL 子 程 序 相 关 联      一 个 和 外 部 函 数 建 立 关 联 的PL/SQL 子 程 序 实 际 上 指 明 了 外 部 函 数 的 内 存 地 址 每 次 调 用 这 个 子 程 序 实 际 上 是 调 用 与 它 相 对 应 的 外 部 函 数 具 体 步 骤 为      ( ) 用ORA_FFI FIND_FUNCTION 或ORA_FFI REGISTER_FUNCTION 得 到 一 个 函 数 柄      ( ) 在PL/SQL 包 体 的 声 明 部 分 定 义 一 个PL/SQL 子 程 序 它 的 第 一 个 参 数 是 类 型 为ORA_FFI FUNCHANDLETYPE 接 下 来 是 依 次 对 应 外 部 函 数 参 数 的PL/SQL 数 据 类 型 的 参 数      ( ) 在 这 个PL/SQL 子 程 序 中 加 入 一 个PRAGMA 接 口 PRAGMA 声 明 就 是 通 过 将 控 制 转 到 一 个 内 存 地 址 来 激 活 这 个 外 部 函 数      生 成 一 个 模 仿 外 部 函 数 的 原 型 的PL/SQL 子 程 序      这 个 子 程 序 就 是 用 户 可 见 的 外 部 函 数 的PL/SQL 接 口 用 户 按 照 它 的 参 数 类 型 和 返 回 值 类 型 来 使 用 外 部 函 数 具 体 步 骤 为      ( ) 在 包 体 的 声 明 部 分 定 义 一 个PL/SQL 子 程 序 它 的 参 数 和 返 回 值 是 和 外 部 函 数 对 应 的PL/SQL 类 型 这 就 是 模 仿 外 部 函 数 原 型 的 一 个 子 程 序      ( ) 在 这 个 子 程 序 中 调 用 与 上 步 生 成 的 与 外 部 函 数 相 关 联 的PL/SQL 子 程 序      ( ) 在PL/SQL 包 的 说 明(Package Spefication) 部 分 输 入 这 个PL/SQL 子 程 序 的 原 型      下 面 是 一 个 完 整 的 为Windows API 函 数winexec 建 立PL/SQL 接 口 的 例 子     PACKAGE WinExec IS    FUNCTION WinExec(Execfile IN VARCHAR    mand 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 VARCHAR    mand IN PLS_INTEGER)    RETURN PLS_INTEGER;       PRAGMA INTERFACE(C i_WinExec );  /*步骤 将一个PL/SQL子程序与外部函数相关联*/      FUNCTION WinExec(Execfile IN VARCHAR    mand IN PLS_INTEGER)    RETURN PLS_INTEGER    IS    execfile_l VARCHAR ( ) := Execfile;    rc PLS_INTEGER;    BEGIN    rc := i_WinExec(fh_WinExec    execfile_l    mand);       RETURN (rc);    END ;    /*步骤 中PL/SQL模仿函数的定义   它实际上就是调用步骤 中与外部函数建立关联的那个函数*/  BEGIN    BEGIN    lh_USER := ora_ffi find_library( Kernel dll );    EXCEPTION WHEN ora_ffi FFI_ERROR THEN    lh_USER := ora_ffi load_library(NULL kernel 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/ 的Form Designer 中 使 用 这 些 外 部 函 数 只 要 把 包 含 这 一 程 序 包 的 程 序 库( PLL) 附 加 进 来 使 用 包 名 函 数 名 就 可 激 活 这 个 外 部 函 数      例 如 WinExec WinExec( c:\\windows\\notepad exe )      具 体Windows API 函 数 数 据 类 型 和PL/SQL 数 据 类 型 的 转 换 可 参 照 Developer/ 中Procedure Builder 帮 助 文 件 中 对ORA_FFI 软 件 包 的 详 细 介 绍 cha138/Article/program/Oracle/201311/18278

相关参考

知识大全 MIS中的图像应用技术[DEVELOPER2000]

MIS中的图像应用技术[DEVELOPER2000]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 在ASP中利用Oracle Object for OLE访问Oracle 8

在ASP中利用OracleObjectforOLE访问Oracle8  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 在ASP中使用Oracle数据库

在ASP中使用Oracle数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle是世

知识大全 如何在Oracle中使用Sequence

如何在Oracle中使用Sequence  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在SQL

知识大全 在oracle中运行OS命令

在oracle中运行OS命令  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    在Oraclei

知识大全 在Oracle9中伪造存储概要

在Oracle9中伪造存储概要  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在前面的文章中我讨

知识大全 在Oracle中使用Java存储过程

在Oracle中使用Java存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java存储

知识大全 在.NET中使用Oracle数据库事务

在.NET中使用Oracle数据库事务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在本文中您

知识大全 在Oracle10g中如何获得索引建议

在Oracle10g中如何获得索引建议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracl

知识大全 在Oracle网络结构中解决连接问题

在Oracle网络结构中解决连接问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近看到好多