动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.2Gb or Not 2Gb.
.Oracle PL/SQL入门之慨述.
.在Oracle中实现定时操作.
.OC4J 10g 10.1.3 数据源中的连接.
.oracle10g无法连接错误排除.
.ORACLE培训教程(3)-SQL概述.
.Oracle9i 数据库管理实务讲座(六.
.如何让postfix找到最佳MX记录.
.在RHEL 3 的单机上安装oracle9i .
.神秘的 ORACLE DUAL.
.Oracle 9i查询使用数据库的用户.
.ORACLE中的ROWID.
.用For Loop 替代Cursor.
.利用Oracle管理服务器将数据导入.
.Linux之菜鸟日记(一).
.如何通过DB link进行远程过程或函.
.orale的tnsping与TCP/IP的ping命.
.使用 Window 脚本宿主自动化 Ora.
.学会使用Oracle中的时间间隔型数.
.Oracle 发布免费开发工具 Raptor.

外部程序使一切变得简单

发表日期:2008-2-9 |



  外部程序其实是储存在DLL或是共享库中的二进制程序,并且可以通过PL/SQL声明从存储程序中访问得到它。这既使得它们成为了存储程序开发者们最强大的开发工具之一。
  
  但是,事实上人们很少使用这些外部程序,也许是因为人们觉得创建DLL和共享库,安装程序以及引用PL/SQL这一系列过程让人觉得非常繁琐。而对应的文档并不能起到什么帮助作用,因为这些文档提供的都是一些深奥的例子,它描述了使用的变量以及子程序使问题变得更加令人费解。
  
  你可以在许多不同的程序编译语言中来创建DLL以及共享库,你也可通过转化脚本语言为二进制代码来实现DLL以及共享库的创建。DLL与共享库作为独立与操作系统的一部分,其实就是像调用执行文件的一部分那样被连接和调用的具有公共入口的二进制映像。这里有一个用C描述的用于二进制处理的DLL:
  
  /* bitop.c */
  #ifdef WIN32
  #define DLLEXP __declspec(dllexport)
  #else
  #define DLLEXP
  #endif /* WIN32 */
  DLLEXP int bitand(int r,int l) { return r & l; }
  DLLEXP int bitor(int r,int l) { return r l; }
  DLLEXP int bitxor(int r,int l) { return r ^ l; }
  DLLEXP int bitshr(int n,int s) { return n << s; }
  DLLEXP int bitshl(int n,int s) { return n >> s; }
  DLLEXP int bitset(int n,int b) { return n (1<<b); }
  DLLEXP int bitclr(int n,int b) { return n ^ (1<<b); }
  DLLEXP int bittst(int n,int b) { return (n & (1<<b)) ? 1 : 0; }
  
  其中唯一超出标准C范围的就是DLLEXP宏,他为Windows提供了这些函数名并且可能被UNIX所忽视。将这些资源代码与你的编译文档相对照,从而你可以从中了解更多关于如何创建DLL的信息。在UNIX环境下使用GNU编译器的话,则包括以下命令行:
  
  GNU C/C++: cc -shared -o libbitop.so.1 bitop.c
  
  从数据库中调用DLL和共享库的下一步就是使用CREATE LIBRARY命令,并给出完整的路径,例如:
  
  CREATE OR REPLACE LIBRARY SCOTT.bitop AS '/home/scott/bitop/libbitop.so.
  
  通常只有DBA账号拥有执行这个命令的权限,但此命令可通过其他用户的行为发出。
  
  然后,这个用户能调用PL/SQL和外部程序来调用任何DLL和共享库,代码如下:
  
  create or replace package bit_op
  as
    function bit_and(l pls_integer,r pls_integer) return pls_integer
    as language c name "bitand" library bitop;
    --
    function bit_or(r pls_integer,l pls_integer) return pls_integer
    as language c name "bitor" library bitop;
    --
    function bit_xor(r pls_integer,l pls_integer) return pls_integer
    as language c name "bitxor" library bitop;
    --
    function bit_shr(n pls_integer,s pls_integer) return pls_integer
    as language c name "bitshr" library bitop;
    --
    function bit_shl(n pls_integer,s pls_integer) return pls_integer
    as language c name "bitshl" library bitop;
    --
    function bit_set(n pls_integer,b pls_integer) return pls_integer
    as language c name "bitset" library bitop;
    --
    function bit_clr(n pls_integer,b pls_integer) return pls_integer
    as language c name "bitclr" library bitop;
    --
    function bit_tst(n pls_integer,b pls_integer) return pls_integer
    as language c name "bittst" library bitop;
  end bit_op;
  
  /
  
  注重这个过程不需要程序包。
假如数据库已经设立好可以接受通过监听器发出的外部程序请求,那么这个过程就完成了。然后你就可以使用以下的查询命令:
  
  select bit_op.bit_and(24,56) from dual where bit_op.bit_tst(24,5) = 1;
  
  假如你没有建立好数据库来接收外部指令请求,那么你必须配置其他的监听器来完成内部联接。
  
  外部程序请求将通过SQL*Net发送给专门的监听服务。再Oracle8i中,许多这种过程都是手工处理的。而在Oracle9i中,大部分可以通过设置完成了。
  
  即设在你的数据库中存在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)
    )
   )
  
  为了得到更好的安全性,变量EXTPROC_DLLS可以设置为DLL序列或是共享库序列。也可以设为ANY从而与叙访问任何DLL和共享库。你可以通过一下这条命令手工的进行连接测试:
上一篇:使用插值在序列中查找遗漏的值 人气:448
下一篇:Oracle 10G 的新特性 人气:422
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-7 站长中国企业(公司)网站系统 v4.2
2008-9-7 PBDigg v2.0 Build 20080821
2008-9-7 玩玩小游戏FLASH系统 v2.1
2008-9-7 522QQ在线电视直播程序 v1.1
2008-9-7 Pcook cms 文章管理系统 (老Y CM
2008-9-7 仿代码小说小偷系统 v1.0
2008-9-7 百度一搜集成搜索管理系统
2008-9-7 小贤统计器 v1.0
2008-9-7 UCenter Home-中秋搏饼插件 v1.2
2008-9-7 iBlacklist通话黑名单汉化破解补
2008-9-7 EndlessWalls无尽壁纸 v1.0.4破解
2008-9-7 Dynolicious车载测量仪v1.1破解版
2008-9-7 iVoodoo巫毒娃娃1.0.1破解版
2008-9-7 iWallpape精品墙纸1.2破解版
2008-9-7 iChillout自然音效工具1.1破解版
2008-9-7 Todo计划提醒1.2破解版
2008-9-7 allRadio电台集合1.01破解版
2008-9-7 My Money个人理财1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号