我酷下载
您的位置:首页-> 技术文章-> -> 数据库类-> Oracle中使用PL/SQL操作COM对象(一)

阅读排行




Oracle中使用PL/SQL操作COM对象(一)

作者未知 来源未知 加入时间:2005-10-22 人气:153
PL/SQL是由Oracle公司对标准SQL进行扩展,专用于Oracle数据库中程序设计的专用语言,属第三代过程式程序设计语言。从Oracle8开始提供了直接从PL/SQL中调用外部C语言过程,允许开发人员用PL/SQL进行使用C语言编制的程序模块。从Oracle8i开始,又引入了Java程序。

   在本文中主要介绍外部例程的基本原理以及使用条件,介绍如何通过引用外部例程来操作Windows中的COM对象,并做了一个操作Excel对象的示例。

   本文的运行环境全部建立在Oracle9i和Windows2000。其中ORACLE的安装目录(ORACLE_HOME)为D:\oracle\ora92,SID为ORADB,主机名为CHANET。

  必要性

   扩展后的PL/SQL语言已经集成了标准SQL,在效率和安全上非常适合设计Oracle数据库程序,但对于应用的某些功能,其它的程序设计语言比PL/SQL更适合,如:使用操作系统资源,C语言在计算和引用系统对象及使用设备上优于PL/SQL,而Java语言在网络上的应用优于PL/SQL。

   如果在应用上要用到不适合用PL/SQL语言的话,这时就要使用其它语言进行编制,然后由PL/SQL作为外部例程进行调用。

   在Oracle8之前的版本,PL/SQL和其它语言的唯一通信是借助于DBMS_PIPE和DBMS_ALERT包来实现,在使用之前必需建立一个OCI接口或预编译器编制的监护程序,使用比较复杂。外部例程的出现,只需在PL/SQL中建立一个函数映射到外部例程对应的函数,就像普通的PL/SQL函数使用一样,简化了使用过程。

  基本原理

   当引用外部C语言例程时,Oracle监听器将启动extproc进程,该进程将会动态地载入共享库(在Windows下称为动态链接库,即是DLL文件),进程起了一个缓冲的作用,当PL/SQL过程调用外部函数时,进程把命令发送到共享库,之后把结果返回给PL/SQL过程。

   进程被调用后随着共享库的使用会话(session)而存在,如果调用完毕或者关闭数据库用户会话,extproc进程会自动关闭。

     使用配置

   在调用外部例程之前,必需进行如下设置:

   ·配置监听器。

   ·配置Net组件服务。

   配置监听器,打开D:\oracle\ora92\network\admin\listener.ora 文件,修改文件参数。


LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = CHANET)(PORT = 1521))
)
(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = IPC)(KEY = extproc1))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\ora92)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = ORADB)
(ORACLE_HOME = D:\oracle\ora92)
(SID_NAME = ORADB)
)
)

   其中有两部份参数对于使用外部例程是很重要的。

   ·(ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = extproc1))

   设置基于IPC协议的外部例程

   ·(SID_DESC =(SID_NAME = PLSExtProc) (ORACLE_HOME = D:\oracle\ora92) (PROGRAM = extproc) )

   记录数据库的相关属性,SID_NAME在默认的情况下是PLSExtproc。

   配置Net组件服务,打开D:\oracle\ora92\network\admin\tnsnames.ora文件,把如下内容保存在该文件里。


EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
  (ADDRESS_LIST =
   (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
  )
  (CONNECT_DATA =
   (SID = PLSExtProc)
   (PRESENTATION = RO)
  )
)

   重要参数说明:

    ·(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

    ·(CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO)

   两设置必需与listener.ora里的一致。

   重启监听器,并测试服务是否可用。

   停止监听器:lsnrctl stop

   启动监听器:lsnrctl start

   测试服务是否可用:


C:\>tnsping EXTPROC_CONNECTION_DATA
TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0 - Production on 07-4月 -2
005 16:57:00
Copyright (c) 1997 Oracle Corporation. All rights reserved.

   已使用的参数文件:


D:\oracle\ora92\network\admin\sqlnet.ora

   已使用 TNSNAMES 适配器来解析别名


Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)
(KEY = EXTPROC1))) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO)))
OK(30毫秒)

   测试extproc进程是否正常:


D:\oracle\ora92\bin>extproc
Oracle Corporation --- 星期四 4月 07 2005 17:37:18.968
Heterogeneous Agent Release 9.2.0.1.0 - Production

   4、使用COM对象说明

   COM对象设计都会提供了三个基本操作给开发人员使用,分别为:获取属性值,设置属性值(只读属性除外),调用方法。Oracle数据库在Windows的平台下提供了操作COM对象的接口,属于C语言外部例程模式。

   工作原理如下图:



图2 操作COM对象工作原理

   在使用该功能之前,需明白如下内容:

   1) 创建COM对象操作函数。


SQL>CONNECT SYSTEM/chanet@oradb
SQL>CREATE USER chanet identified by chanet;
SQL>GRANT CREATE LIBRARY TO chanet;
SQL>CONNECT chanet/chanet@oradb;
SQL>@D:\oracle\ora92\com\comwrap.sql;

   2)配置监听器。

   在listener.ora文件里,添加如下内容,并重启监听器。


STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER = 10
TRACE_LEVEL_LISTENER = off
PASSWORDS_LINTENER = (oracle)

   3) PL/SQL数据类型与对应的COM对象类型

   表1-1数据类型比较

PL/SQL数据类型  COM API 数据类型  
VARCHAR2  BSTR  
BOOLEAN BOOL
BINARY_INTEGER  BYTE,INT,LONG  
DOUBLE PRECISION  DOUBLE,FLOAT,CURRENCY  
DATE DATE

   4) 函数说明。

   表1-2函数说明

名称 功能描述  
CreateObject  创建对象  
DestroyObject 关闭对象
GetLastError  获取错误信息  
GetProperty 获取属性值
SetProperty 设置属性值
InitArg  为Invoke函数初始化参数  
InitOutArg  为GetArg初始化输出参数  
GetArg  获取输出参数
SetArg 为Invoke函数设置参数  
Invoke  调用COM对象的函数或过程 


相关文章

相关软件

联系我们 广告服务 友情链接 版权说明 软件发布 下载帮助

CopyRight
2005-2016 www.5qcn.net All Rights Reserved 版权所有 【我酷】下载