仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1139|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL编程:利用Oracle完成及时通讯

[复制链接]
第二个灵魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:43:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。oracle
  因为Oracle不供应用于及时输入动静的工具,Oracle数据库开辟者老是要面对及时监督他们的储蓄历程实行的应战。他们必需利用dbms_output.put_line挪用,这个挪用直到历程完成才前往了局。

  在本文中,我想演示怎样从Oracle8i数据库间接发送电子邮件,作为一种及时通讯办理计划。如许我们要监督存储历程就不再必要守候它们完成了,如许的办法还为开辟者供应了其他的一些优点:



   .能够在几分钟内调试一些很长的批处置历程,而不必要等几个小时;

   .盘算用于指定代码块所需的实行工夫;

  这就必要办理一个成绩,我们怎样从运转的存储过程当中输入动静以便我们能够立即反省它们,即便我们不在办公场合?我们的做法是把一切必须的历程与函数包装在自界说的包中,然后利用Oracle8iUTL_SMTP包间接地从Oracle数据库中发送电子邮件。上面我将具体解说一些这个历程。

  Oracle的UTL_SMTP包

  在Oracle8i中引进了UTL_SMTP包(SMTP代表SimpleMailTransferProtocol复杂邮件传送协定,利用TCP端口25在客户机和服务器之间创建通讯联系),使开辟者可以从数据库发送电子邮件。

  只要安装带有Java假造机(JVM)的8i或更高的版本才干利用UTL_SMTP。别的还必需把plsql.jar载进数据库中。不然,当挪用UTL_SMTPAPI来发送电子邮件的时分我们将失掉上面的非常:ORA-29540:classoracle/plsql/net/TCPConnectiondoesnotexist。

  默许的$ORACLE_HOME/javavm/install/initjvm.sql剧本(安装了JVM)不运转把plsql.jar载进数据库的initplsj.sql剧本。体系用户大概外部用户能够手工运转$ORACLE_HOME/RDBMS/ADMIN/initplsj.sql剧本以办理这个成绩。假如你没有可用的剧本,你要末能够从Oracle撑持那边失掉它,要末能够复杂地间接利用loadjava载进有用程序plsql.jar:

  loadjava-usersys/password@database-resolveplsql/jlib/plsql.jar

  UTL_SMTPAPI:

  本文的代码中利用了以下UTL_SMTP包中的API:

   OPEN_CONNECTION():翻开到复杂邮件传送协定服务器的毗连。

   HELO():实行毗连以后创建与复杂邮件传送协定服务器初始的收发干系功效,它能辨认发送到服务器的“信使”。

   MAIL():初始化与服务器的邮件互换,可是现实上不发送动静。

   RCPT():辨认动静的承受者。为了把一条动静发送到多个承受者,你必需屡次挪用这个历程。

   DATA():指定电子邮件的内容。

   QUIT():停止一个SMTP会话而且断开与服务器的毗连。

  为了使用使用程序编程接口,把上面的挪用依照给定的按次放进程序中:

   挪用OPEN_CONNECTION

   挪用HELO

   挪用MAIL

   挪用RCPTforeachrecipient

   格局化电子邮件的内容然后挪用MAIL

   挪用QUIT

  EmailUtils包标准

  EmailUtils包包含以下API:

   SetSender/GetSender-设置/获得发送者

   SetRecipient/GetRecipient-设置/获得承受者

   SetCcrecipient/GetCcrecipient-设置/获得抄件承受者

   SetMailHost/GetMailHost-设置/获得邮件主机

   SetSubject/GetSubject-设置/获得主题

   Send-发送邮件

  代码1申明了EmailUtils包的标准:


createorreplacepackageEmailUtilsas

procedureSetSender(pSenderinvarchar2);
functionGetSender
returnvarchar2;

procedureSetRecipient(pRecipientinvarchar2);
functionGetRecipient
returnvarchar2;

procedureSetCcRecipient(pCcRecipientinvarchar2);
functionGetCcRecipient
returnvarchar2;

procedureSetMailHost(pMailHostinvarchar2);
functionGetMailHost
returnvarchar2;

procedureSetSubject(pSubjectinvarchar2);
functionGetSubject
returnvarchar2;


procedureSend(pMessageinvarchar2);

procedureSend(pSenderinvarchar2,
pRecipientinvarchar2,
pMailHostinvarchar2,
pCcRecipientinvarchar2:=null,
pSubjectinvarchar2:=null,
pMessageinvarchar2:=null);

endEmailUtils;
/


  能够看出,Send历程是重载历程:包标准中包含这个历程的两个版本。一个版本当最少三个强迫性参数要划定的时分援用,pSender,pRecipient和pMailHost:

procedureSend(pSenderinvarchar2,
pRecipientinvarchar2,
pMailHostinvarchar2,
pCcRecipientinvarchar2:=null,
pSubjectinvarchar2:=null,
pMessageinvarchar2:=null);
 另外一个版本只要当供应pMessage参数值时实行:



   procedureSend(pMessageinvarchar2);

  第二个版本是用作调试的版本。一切的电子邮件动静共用一样的发送者、承受者、邮件主机、抄送承受者和主题信息,这些都是我在会话的入手下手的时分设置好的。上面是一个PL/SQL程序块的例子:


begin

EmailUtils.SetSender(WayneZ@MyCompany.com);
EmailUtils.SetRecipient(waynezheng@vip.sina.com);
EmailUtils.SetCcRecipient(WayneZ@MyCompany.com);
EmailUtils.SetMailHost(MyServer.MyCompany.com);
EmailUtils.SetSubject(DeleteClassificationsprocedure:Run1);

end;
/


  一个实践的电子邮件动静将在每一个Send历程挪用中被指定。我们能够把所用的EmailUtils.Send()挪用拔出到我们调试的代码中,我们之前为了失掉一样的调试了局利用的是DBMS_OUTPUT.PUT_LINE()挪用。:


vMessage:=Point1.||utl_tcp.crlf||
Rowsprocessed:||to_char(vRows)||utl_tcp.crlf||
Elapsedtime:||vTime;

EmailUtils.Send(vMessage);


vMessage:=Point3.||utl_tcp.crlf||
Rowsprocessed:||to_char(vRows)||utl_tcp.crlf||
Elapsedtime:||vTime;

EmailUtils.Send(vMessage);


  代码2显现带有重载Send历程的EmailUtils规格。我们能够看到,Send历程的代码相称复杂。UTL_SMTP包不供应用于格局化动静内容的使用编程接口。而是由用户卖力格局化动静。这就是为何以下程序块要被包括到每一个Send过程当中以便格局化电子邮件的头部。

vMessage:=Date:||
to_char(sysdate,fmDy,DDMonYYYYfxHH24:MI:SS)||
utl_tcp.crlf||
From:||pSender||utl_tcp.crlf||
Subject:||pSubject||utl_tcp.crlf||
To:||pRecipient||utl_tcp.crlf;

  同时,假如动静长度凌驾2000字符的话,你大概失掉一个毛病(ORA-06502:PL/SQL:numericorvalueerror)。以是为了不呈现这个毛病,我们利用上面的程序块,不同意动静凌驾2000个字符:

iflength(vMessage)>2000
then
vMessage:=substr(vMessage,1,2000);
endif;

  假如必要发送带有凌驾2000字的电子邮件,那末可使用另三个UTL_SMTP使用程序编程接口,供应比DATA()历程加倍精密的把持。起首,OPEN_DATA()发送数据命令。然后WRITE_DATA()增加数据到你要发送的字符串中。你能够挪用WRITE_DATA()恣意屡次,如许你就能够一次写2000个字符以克制字数的限定。最初,CLOSE_DATA()经由过程发送一个封装在CRLF中的停止周期停止电子邮件动静。

  及时动静使你的生存加倍温馨

  从数据库发送电子邮件就是那末简单。一旦你试用这个复杂的操纵,我信任你会发明它很有效,便于你的数据库操纵,比方调试、远程的数据库监控和输入数据库数据。

  每一个数据库开辟者都有在代码中利用大批的DBMS_OUTPUT挪用的调试履历。在入手下手一个SQL*Plus会话以后,输出SETSERVEROUTPUTON然后运转这个历程。放进DBMS_OUTPUT.PUT_LINE挪用的动静显现在屏幕上--可是只要在历程完成今后才干显现出来。这个历程极度地贫苦,特别在调试长的批处置时一般是要运转整晚。你能够守候10到12小时仅仅是为了查堕落误的代码,然后修正,再往守候下一个10到12个小时?但是,假如你有会见动静的及时的举措,那末你能够在头5到10分钟内捕获到成绩。

  DBMS_OUTPUT包也有其他的弱点。比方,它不承受可变的布尔范例和它有255字符每行的限定(假如你想输入一个长的动静的话,那末你会失掉这个非常:ORA-20000:ORU-10028:linelengthoverflow,limitof255bytesperline)。把它的弱点全体列出这已超越本文的局限了,可是主要结论就是DBMS_OUTPUT包不准数据库开辟者及时的看到动静。

  谈到服务器上的OS文件,你会不会喜好把选定的数据从服务器中输入到一个Excel电子表格呢?一个举措就是利用Oracle的UTL_FILE包,它供应了一个尺度OS流文档输出/输入的限定级版本。但是,PL/SQL程序只能会见在初始化文件INIT.ORA的UTL_FILE_DIR参数划定的目次。这个参数年夜多半情形下是空的。为了使这个目次可用来举行文件会见,必需请数据库办理者修正初始化文件。这有些贫苦。利用EmailUtils包,你能够简复杂单的把数据写进一个电子邮件中,发送给本人,然后收到它的正本粘贴到本人喜好的文档编纂器中。
DBaaS并不意味着解决方案提供者要让自己失业。与其他系统一样,在实施DBaaS解决方案时,客户可能需要部署、迁移、支持、异地备份、系统集成和灾难恢复等方面的帮助。
深爱那片海 该用户已被删除
沙发
发表于 2015-1-19 21:50:39 | 只看该作者
相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐
admin 该用户已被删除
板凳
发表于 2015-1-28 11:20:19 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
若相依 该用户已被删除
地板
发表于 2015-2-5 15:02:30 | 只看该作者
光写几个SQL实在叫无知。
老尸 该用户已被删除
5#
发表于 2015-2-12 09:31:08 | 只看该作者
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
若天明 该用户已被删除
6#
发表于 2015-3-3 02:04:57 | 只看该作者
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-11 08:30:13 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
简单生活 该用户已被删除
8#
发表于 2015-3-18 00:29:07 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
飘飘悠悠 该用户已被删除
9#
发表于 2015-3-25 08:51:28 | 只看该作者
比如日志传送、比如集群。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 19:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表