我从vb调用存储过程,在存储过程中调用外部dll中的函数。请看这些设置对吗?
运行时错误:
ORA-28575: unable to open RPC connection to external procedure agent1)in tnsnames.oraextproc_connection_data = (DESCRIPTION =
(ADDRESS = (PROTOCOL=IPC)
(KEY=extproc_key)
)
(CONNECT_DATA = (SID = extproc_agent)
)2)in 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=E:/oracle/ora92)
(PROGRAM=extproc)
)
)
3) CREATE LIBRARY AGIS_LIB AS 'F:/projects/test/vctstdll/debug/vctstdll.dll';
4) PL/SQL
CREATE PROCEDURE TESTPROC (
(
STR1 in VARCHAR2
)
as
RES PLS_INTEGER;
begin
RES := TEST_1(STR1);
end;CREATE FUNCTION TEST_1 (
STR_IN VARCHAR2 ,
)RETURN PLS_INTEGER
AS EXTERNAL
LIBRARY AGIS_LIB
NAME "test1"
LANGUAGE C;5)DLL中的函数原型:
_declspec(dllexport) long _stdcall test1(LPTSTR strIn);
运行时错误:
ORA-28575: unable to open RPC connection to external procedure agent1)in tnsnames.oraextproc_connection_data = (DESCRIPTION =
(ADDRESS = (PROTOCOL=IPC)
(KEY=extproc_key)
)
(CONNECT_DATA = (SID = extproc_agent)
)2)in 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=E:/oracle/ora92)
(PROGRAM=extproc)
)
)
3) CREATE LIBRARY AGIS_LIB AS 'F:/projects/test/vctstdll/debug/vctstdll.dll';
4) PL/SQL
CREATE PROCEDURE TESTPROC (
(
STR1 in VARCHAR2
)
as
RES PLS_INTEGER;
begin
RES := TEST_1(STR1);
end;CREATE FUNCTION TEST_1 (
STR_IN VARCHAR2 ,
)RETURN PLS_INTEGER
AS EXTERNAL
LIBRARY AGIS_LIB
NAME "test1"
LANGUAGE C;5)DLL中的函数原型:
_declspec(dllexport) long _stdcall test1(LPTSTR strIn);
(SID_LIST =
(SID_DESC = (SID_NAME=extproc_agent)
(ORACLE_HOME=E:/oracle/ora92)
(ENVS=EXTPROC_DLLS=F:/projects/test/vctstdll/debug/vctstdll.dll)
(PROGRAM=extproc)
)
)
需要指明dll所在位置
(ENVS=EXTPROC_DLLS=F:/projects/test/vctstdll/debug/vctstdll.dll)
ora-03113: end-of-file on communication channel
意思是连对extproc.exe的连接都不能建立。
请看看.ora文件的配置,基本是缺省:(会是因为当前用户对extproc的权限不够吗?)
1)listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = sgcos008)(PORT = 1521))
)
)SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = AGISDB01)
(ORACLE_HOME = e:\oracle\ora92)
(SID_NAME = AGISDB01)
)
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = extproc)
(ORACLE_HOME = e:\oracle\ora92)
)
)2)tnsnames.ora
...
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC))
)
(CONNECT_DATA =
(SID = extproc)
(PRESENTATION = RO)
)
)一定高分相送!谢谢!
1)listener.oraLISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = houwenqiang)(PORT = 1521))
)STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER = 10
TRACE_LEVEL_LISTENER = ONSID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = Ora.domain)
(ORACLE_HOME = D:\oracle\ora92)
(SID_NAME = Ora)
)
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = PLSExtProc)
(ENVS=EXTPROC_DLLS=f:\lexer\OraLexer.dll)
(ORACLE_HOME = D:\oracle\ora92)
)
)
2)tnsnames.ora
ORA_192.168.168.111 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.168.111)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ORA)
(SERVER = DEDICATED)
)
)ORA.HAILIANG.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = houwenqiang)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = Ora.domain)
)
)ORA_HAILLIANG.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = Hailliang.com)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ORA)
(SERVER = DEDICATED)
)
)EXTPROC_CONNECTION_DATA.HAILIANG.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = houwenqiang)(PORT = 1521))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)INST1_HTTP.HAILIANG.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = houwenqiang)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = MODOSE)
(PRESENTATION = http://HRService)
)
)