日期:2014-05-16  浏览次数:20899 次

外部过程代理程序~~请教
外部过程代理程序

在listener.ora和tnsnames.ora里面有关于外部过程代理程序的配置,如下
listener.ora里面:
LISTENER =
  (DESCRIPTION_LIST =
  (DESCRIPTION =
  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
  # IPC进程间通信协议,就是说只在本机通信。KEY=EXTPROC1 是什么意思啊
  )
  (DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  )
  )


SID_LIST_LISTENER =
  (SID_LIST =
  (SID_DESC =
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (SID_NAME = sun)
  )
  (SID_DESC =
  (PROGRAM = extproc)
  # 外部过程代理程序的名称,在ORACLE_HOME\bin目录里面
  (SID_NAME = PLSExtProc)
  # SID_NAME 这个又是什么意思啊,oracle不允许更改这个名称
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  )
  )


tnsnames.ora里面:

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
  # KEY=EXTPROC1 与listener.ora里面的是对应的
  )
  (CONNECT_DATA =
  (SID = PLSExtProc)
  # 与listener.ora里面的 SID_NAME是对应的
  (PRESENTATION = RO)
  # 这个是什么呢
  )
  )

KEY,SID_NAME,SID=PLSExtProc,RO都是什么意思啊

------解决方案--------------------
http://www.kyuanma.com/book/shujuku/Oracle/201008093767_2.html
------解决方案--------------------
即设在你的数据库中存在tnsnames.ora这样一个文件,你要确保你有能告诉客户端怎样联接到数据库并发出外部请求的设置,设置如下:

EXTPROC_CONNECTION_DATA.world =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_KEY))
(CONNECT_DATA=(SID=EXTPROC_AGENT))


请注重,EXTPROC_CONNECTION_DATA,这个名字是强制不变的。而.world则需要设置为与你的数据库具有相同的域。同时EXTPROC_KEY和EXTPROC_AGENT则必须与你的listener.ora文件中的设置相匹配。其中listener.ora文件设置如下:

EXTERNAL_PROCEDURE_LISTENER =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL=IPC)(KEY=EXTPROC_KEY))
)

SID_LIST_EXTERNAL_PROCEDURE_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME=EXTPROC_AGENT)
(ORACLE_HOME = c:\oracle\ora81)
(PROGRAM = EXTPROC)
)


在Oracle9i数据库中,EXTPROC_CONNECTION_DATA应该已经被定义用于连接PLSExtProc,并且能在你自己的外部请求中使用。但是,任何没有在监听方的环境变量EXTPROC_DLL 中明确指出的DLL,Oracle9i都拒绝了对其的访问权,从而增加了一些附加安全定义。在外部过程中,这个变量需要使用SID_DESC中的ENV参数,具体代码如下:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/prodUCt/9.2.0)
(PROGRAM = extproc)
(ENVS="EXTPROC_DLLS=ANY")
)
(SID_DESC =
(GLOBAL_DBNAME = ikan.us.oracle.com)
(ORACLE_HOME = /u01/app/oracle/product/9.2.0)
(SID_NAME = ikan)
)