[转]数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令
2007-02-09 14:49
681 查看
1 数据库程序库
主要介绍使用ORACLE数据库的LIBRARY功能访问操作系统的共享程序库或动态链接库(DLL)
1.1 环境设置
l 检查extproc程序是否安装正确,在操作系统下,运行:
$ $ORACLE_HOME/bin//extproc
若显示结果为以下字样,则表示安装正确
Oracle Corporation --- WEDNESDAY JAN 24 2007 14:58:30.598
Heterogeneous Agent Release 10.1.0.4.0 – Production
l 检查环境变量是否设置正确:
$ echo $LD_LIBRARY_PATH
结果应该为:
$ORACLE_HOME/lib:/usr/lib:$ORACLE_HOME/ctx/lib
如果不是,则需要在数据库德操作系统用户的配置文件中设置
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:$ORACLE_HOME/ctx/lib
export LD_LIBRARY_PATH
1.2 数据库设置
数据库的缺省设置中一般都已经存在,若没有,请增加相关部分的内容
1.2.1 listener.ora文件设置
确认extproc的相关设置已经存在该文件中,没有则增加。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = cmstest)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(SID_NAME = cmstest)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.30.2.21)(PORT = 1521))
(ADDRESS= (PROTOCOL= IPC)(KEY= EXTPROCTEST))
)
修改该文件后,需要重新启动监听程序:
$ORACLE_HOME/bin/lsnrctl stop
$ORACLE_HOME/bin/lsnrctl start
1.2.2 tnsnames.ora文件设置
如果没有extproc_connection_data,则需要增加,注意名称不能改变,若sqlnet.ora中要求有domain的附加信息,则可以按照要求增加,如extproc_connection_data.zte.com.cn
另外,KEY和SID需要与listener.ora中的保持一致。
extproc_connection_data =
(DESCRIPTION=
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROCTEST))
)
(CONNECT_DATA=
(SID=PLSExtProc)
) )
1.3 使用举例
l 编写一个调用操作系统命令的程序,采用编辑器,编写一个C程序:extproc.c
---- 程序代码开始 ---------
int sysrun(char *command)
{
return system(command);
}
----- 程序代码结束 --------
l 使用make命令,将C程序编译成为.so程序
make –f $ORACLE_HOME/rdbms/demo/demo_rdbms.mk extproc_no_context SHARED_LIBNAME=extproc.so OBJS=extproc.o
l 将文件extproc.so复制到目录$ORACLE_HOME/lib下
cp extproc.so $ORACLE_HOME/lib/.
l 在数据库中,创建程序库
SQL> create or replace library shell_lib as ‘$ORACLE_HOME/lib/extproc.so’;
l 创建数据库存储过程,与extproc中的程序建立联系
create or replace procedure sysrun(syscomm in varcha2) as
language C
name “sysrun”
library shell_lib
parameters(syscomm string);
l 这样,就可以运行操作系统得命令了,如:
Begin
-- 列出目录下的所有文件名到文件j01.txt中
sysrun('/bin/ls -l >/tmp/j01.txt');
-- 运行sql*loader工具
Sysrun(’$ORACLE_HOME/bin/sqlldr userid=<连接串> control=<控制文件名>’);
end;
主要介绍使用ORACLE数据库的LIBRARY功能访问操作系统的共享程序库或动态链接库(DLL)
1.1 环境设置
l 检查extproc程序是否安装正确,在操作系统下,运行:
$ $ORACLE_HOME/bin//extproc
若显示结果为以下字样,则表示安装正确
Oracle Corporation --- WEDNESDAY JAN 24 2007 14:58:30.598
Heterogeneous Agent Release 10.1.0.4.0 – Production
l 检查环境变量是否设置正确:
$ echo $LD_LIBRARY_PATH
结果应该为:
$ORACLE_HOME/lib:/usr/lib:$ORACLE_HOME/ctx/lib
如果不是,则需要在数据库德操作系统用户的配置文件中设置
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:$ORACLE_HOME/ctx/lib
export LD_LIBRARY_PATH
1.2 数据库设置
数据库的缺省设置中一般都已经存在,若没有,请增加相关部分的内容
1.2.1 listener.ora文件设置
确认extproc的相关设置已经存在该文件中,没有则增加。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = cmstest)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(SID_NAME = cmstest)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.30.2.21)(PORT = 1521))
(ADDRESS= (PROTOCOL= IPC)(KEY= EXTPROCTEST))
)
修改该文件后,需要重新启动监听程序:
$ORACLE_HOME/bin/lsnrctl stop
$ORACLE_HOME/bin/lsnrctl start
1.2.2 tnsnames.ora文件设置
如果没有extproc_connection_data,则需要增加,注意名称不能改变,若sqlnet.ora中要求有domain的附加信息,则可以按照要求增加,如extproc_connection_data.zte.com.cn
另外,KEY和SID需要与listener.ora中的保持一致。
extproc_connection_data =
(DESCRIPTION=
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROCTEST))
)
(CONNECT_DATA=
(SID=PLSExtProc)
) )
1.3 使用举例
l 编写一个调用操作系统命令的程序,采用编辑器,编写一个C程序:extproc.c
---- 程序代码开始 ---------
int sysrun(char *command)
{
return system(command);
}
----- 程序代码结束 --------
l 使用make命令,将C程序编译成为.so程序
make –f $ORACLE_HOME/rdbms/demo/demo_rdbms.mk extproc_no_context SHARED_LIBNAME=extproc.so OBJS=extproc.o
l 将文件extproc.so复制到目录$ORACLE_HOME/lib下
cp extproc.so $ORACLE_HOME/lib/.
l 在数据库中,创建程序库
SQL> create or replace library shell_lib as ‘$ORACLE_HOME/lib/extproc.so’;
l 创建数据库存储过程,与extproc中的程序建立联系
create or replace procedure sysrun(syscomm in varcha2) as
language C
name “sysrun”
library shell_lib
parameters(syscomm string);
l 这样,就可以运行操作系统得命令了,如:
Begin
-- 列出目录下的所有文件名到文件j01.txt中
sysrun('/bin/ls -l >/tmp/j01.txt');
-- 运行sql*loader工具
Sysrun(’$ORACLE_HOME/bin/sqlldr userid=<连接串> control=<控制文件名>’);
end;
相关文章推荐
- [转]数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令 - 雪山之巅的阳光 - 博客园
- 数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令
- 利用数据库存储过程来实现分页功能
- VB中调用带参数存储过程的实现(数据库)
- 在JAVA中实现数据库存储过程的统一调用
- java语言利用Socket实现对操作系统的命令调用和文件传输
- 调用存储过程,java中通过bboss persistent实现数据库存储过程的调用(位置变量绑定)
- 存储过程调用,java中通过bboss persistent实现数据库存储过程的调用(命名变量绑定)
- 利用Sql作业在asp.net 里面实现异步调用存储过程.
- mysql利用存储过程实现对数据库数据的迁移
- 利用动态代理实现通用存储过程的调用
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- sql server调用数据库存储过程接口导入数据
- asp.net利用存储过程实现模糊查询示例分享
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页[转]
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
- ASP 调用带返回参数和记录集的存储过程二次访问数据库服务器的解决办法
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
- sqlserver 存储过程动态参数调用实现代码
- Hibernate HQL基础 调用数据库存储过程