Oracle 9I系统调用动态库功能示例与实现

需积分: 1 0 下载量 111 浏览量 更新于2024-09-19 收藏 3KB TXT 举报
本文档主要介绍了如何在Oracle数据库9i版本上实现调用动态库(如DLL)中的函数,以便在Linux或Windows环境下扩展应用程序。在9I之前,这种功能可能需要手动配置,但随着Oracle 10G及更高版本的内置支持,这个过程变得更加便捷。以下是核心步骤: 1. 权限设置: - 首先,需要为用户`cdx`创建并授权,允许其连接、创建库、创建存储过程等操作: - `createuser cdx identified by '123';` - 授予`cdx`用户与操作系统交互的权限,例如: - `grant connect to cdx;` - `grant create library to cdx;` - `grant create procedure to cdx;` - 创建公共别名,使外部程序可以访问库: - `create public synonym cdxpack for cdx.cdxpack;` - 设置默认表空间和配额: - `alter user cdx default tablespace users temporary tablespace temp;` - `alter user cdx quota unlimited on users;` 2. 数据表创建: - 定义一个用于记录命令运行日志的表,包括用户名称、运行日期、命令字符串、参数字符串和运行结果代码: ```sql CREATE TABLE cdx.cmd_run_log ( usr_name VARCHAR2(50), run_date DATE, cmd_str VARCHAR2(50), para_str VARCHAR2(50), run_ret_code NUMBER(10) ); ``` 3. C语言扩展: - 在`extproc.c`文件中编写了一个C函数`RunSysCmd`,该函数接受命令字符串和参数字符串作为输入,执行操作系统命令: - 定义一个命令字符串数组`CmdStr`,根据输入构建命令。 - 使用`system()`函数执行命令,并返回执行结果。 4. 编译和链接: - 对C源代码进行编译,并链接到所需的库(如`linkmsvcrt.lib`),生成`extproc.dll`动态链接库: ``` cl -I. -L e:\extproc /LD extproc.c /link msvcrt.lib /nodefaultlib:libcmt /DLL ``` - 将编译后的动态库添加到Oracle环境中: ```sql sqlplus cdx/123 ... CREATE OR REPLACE LIBRARY cdxlib IS 'e:\extproc\extproc.dll'; ``` 5. 创建包和函数: - 在Oracle数据库中创建一个包`cdxpack`,包含名为`RunSysCmd`的函数,用于调用`RunSysCmd`函数: ```sql CREATE OR REPLACE PACKAGE cdxpack AS FUNCTION RunSysCmd(str IN CHAR, parastr IN CHAR) RETURN BINARY_INTEGER; END cdxpack; ... CREATE OR REPLACE PACKAGE BODY cdxpack AS FUNCTION RunSysCmd(str IN CHAR, parastr IN CHAR) RETURN BINARY_INTEGER AS LANGUAGE C NAME 'RunSysCmd(char*, char*)'; END cdxpack; ``` 通过以上步骤,你可以在Oracle 9i环境下成功地为系统添加一个能够调用外部动态库函数的接口,这在处理需要外部工具支持的应用场景时非常有用。然而,随着Oracle版本升级,建议采用更现代的方法,利用Oracle的高级特性,如PL/SQL External Functions,以提高性能和安全性。