- 在 Oracle 的存储过程执行中,我们可能希望它本身能完成邮件发送执行的结果,特别是在捕获到了异常时。不能总是依赖于调用存储过程的外部程序--调用后,根据出口参数,发送执行结果。这一需求更迫切的表现在非人工参与的 Oracle Job 调用存储过程的情况下。
所幸,Oracle 为我们提供了发送邮件的工具包 UTL_SMTP,它最早出现在 Oracle 8.1.7 版本中。下面是我从网络上搜索相关资料后、综合整理、多处修正、数次调试、排除万难而写出的一个发送邮件的存储过程。可支持需用户验证的邮件服务器,中文标题和中文内容无乱码,只还未支持附件的发送,相信这方面应用较少,需要的话再 Google 一下,且文后参考中有相应的链接。 Read More - 如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 Select 的结果要 into 到变量中时就要稍加留心一下了。而在 8i 以前的版本(谁还用这么古老的玩艺,总有些不得已的地方,老系统考虑升级成本遗留下来的,应用软件所伴随着的等),都没法用 execute immediate,就得使用 DBMS_SQL 包来实现了
何谓动态 SQL 和 DDL 语句呢?通常在过程中要操作的表名、字段名都必须是明确的,否则编译过程时就要报错,但如果这两者也用变量名来表示就是动态的。DDL 就是数据库对象定义的操作,如 CREATE TABLE/VIEW/INDEX/SYN/CLUSTER....,及这些对象的删除、修改操作等等。 Read More - 十. 配置 Quartz 数据源
如果你在使用 JDBC JobStore,就需定义要用到的数据源。而如果使用的是 JobStoreCMT,你实际上需要定义两个数据源。数据源可由三种方式来配置:
·在 quartz.properties 文件中指定连接池属性,这样 Quartz 能亲自创建数据源。
·指定应用服务器管理的数据源所在 JNDI 的位置,Quartz 直接使用它。
·还可使用自定义的 org.quartz.utils.ConnectionProvider 实现类。 Read More - 九. 配置 JobStoreCMT
JobStoreCMT 提供了另一类型的 JobStore,它能工作于一个关系型数据库之下。你能通过设置 org.quartz.jobStore.class 属性来选用 JobStoreCMT:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
当使用 JobStoreCMT 时,可设置一些附加属性,它们是表 A.5 所示的。 Read More - 八. 配置 JobStoreTX JobStore
你可以像下面那样设定类名来选择 JobStoreTX 类:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
表 A.4 列出了配置 Quartz JobStore 的可用属性。只有少数几个属性是必须的,而且其他的都有合理的默认值。 Read More - Oracle 中的存储过程在有些情况下会变成失效状态,在 PL/SQL Developer 中该存储过程的图标左上角显示一把小红叉叉。比如储过程所引用的对象失效,dblink 出问题啦都可能引起用到它的存储过程失效。再就我的存储过程经常会变成无效,至今原因都未查明。
查询 dba_dependencies 视图可以看到存储过程所引用的对象,再就在 dba_objects 视图中可以看到对象的 created 和 last_ddl_time 时间。
上面的那种无效的存储程,只要不是语法上有问题,重新编译一下又是可用的了。总不能每次发现时人工去编译的,所以要实现自动化,有以下两种方法(网上找到的所有的 在Oracle中重新编译所有无效的存储过程 代码排版都很混乱,所以主要是重新整理了): Read More - 在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:
1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中
2. 建立数据库间的 dblink,然后用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where ...
3. exp A 表,再 imp 到 B 表,exp 时可加查询条件
4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交
5. 再就是本篇要说到的 Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显
第 1 种方法在记录多时是个噩梦,需三五百条的分批提交,否则客户端会死掉,而且导入过程很慢。如果要不产生 REDO 来提高 insert into 的性能,就要下面那样做: Read More 现属 Sun 旗下的虚拟机软件 VirtualBox 出了 2.1.0 版,看这篇文章对 2.1.0 版 VirtualBox 的介绍: http://www.cnbeta.com/articles/73057.htm。 在 32 位的主机上可安装 64 位的客户系统,而且也加入了 OpenGL 3D。详见 查看官方的更新文档 这很值得体验一番。
于是下载了 VirtualBox-2.1.0-41146-Win_x86.msi 来安装,安装过程中很多的 未通过 Windows 微标的测试 的提示,不管这些,统统 Continue Anyway 过去。安装完了,一启动,弹出窗口报错了, 错误界面如下: Read More
- 六. 配置 Quartz RMI 选项
当通过 RMI 使用 Quartz 启动一个 Quartz 实例时,你需要把它配置为经由 RMI "导出" 服务。然后你就能创建客户端,配置它们的 Quartz Scheduler 作为 "代理" 工作而连接到服务端来。表 A.3 列出了可用的 RMI 设定。
Read More表 A.3. Quartz 使用 RMI 时的属性 名称 必须 类型 默认值 org.quartz.scheduler.rmi.export 否 Boolean false org.quartz.scheduler.rmi.registryHost 否 String localhost org.quartz.scheduler.rmi.registryPort 否 Integer 1099 org.quartz.scheduler.rmi.createRegistry 否 String never org.quartz.scheduler.rmi.serverPort 否 Integer Random org.quartz.scheduler.rmi.proxy 否 Boolean false - 二. 配置 Quartz ThreadPool
表 A.2 列出了配置 Quartz ThreadPool 可用的属性。只有少些属性是必须的,剩下的都有合理的默认值。
Read More表 A.2. 配置 Quartz ThreadPool 的属性 名称 必须 类型 默认值 org.quartz.threadPool.class 是 String null org.quartz.threadPool.threadCount 是 Integer -1 org.quartz.threadPool.threadPriority 否 Integer 5 org.quartz.threadPool.makeThreadsDaemons 否 boolean false org.quartz.threadPool.threadsInheritGroup-
OfInitializingThread否 boolean true org.quartz.threadPool.threadsInheritContext-
ClassLoaderOfInitializingThread否 boolean false