Oracle 过程中执行动态 SQL 或 DDL 语句

如果你用的是 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....,及这些对象的删除、修改操作等等。 阅读全文 >>

Quartz Job Scheduling Framework[翻译]附录 A. Quartz 配置参考 (第六部分)

十. 配置 Quartz 数据源

如果你在使用 JDBC JobStore,就需定义要用到的数据源。而如果使用的是 JobStoreCMT,你实际上需要定义两个数据源。数据源可由三种方式来配置:

·在 quartz.properties 文件中指定连接池属性,这样 Quartz 能亲自创建数据源。

·指定应用服务器管理的数据源所在 JNDI 的位置,Quartz 直接使用它。

·还可使用自定义的 org.quartz.utils.ConnectionProvider 实现类。 阅读全文 >>

Oracle 中重新编译无效的存储过程, 或函数、触发器等对象

Oracle 中的存储过程在有些情况下会变成失效状态,在 PL/SQL Developer 中该存储过程的图标左上角显示一把小红叉叉。比如储过程所引用的对象失效,dblink 出问题啦都可能引起用到它的存储过程失效。再就我的存储过程经常会变成无效,至今原因都未查明。

查询 dba_dependencies 视图可以看到存储过程所引用的对象,再就在 dba_objects 视图中可以看到对象的 created 和 last_ddl_time 时间。

上面的那种无效的存储程,只要不是语法上有问题,重新编译一下又是可用的了。总不能每次发现时人工去编译的,所以要实现自动化,有以下两种方法(网上找到的所有的 在Oracle中重新编译所有无效的存储过程 代码排版都很混乱,所以主要是重新整理了): 阅读全文 >>

关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

在 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 的性能,就要下面那样做: 阅读全文 >>

VirtualBox 2.1.0 启动时提示 "虚拟电脑控制台 - 严重错误" 的处理

现属 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 过去。安装完了,一启动,弹出窗口报错了,错误界面如下: 阅读全文 >>

Quartz Job Scheduling Framework[翻译]附录 A. Quartz 配置参考 (第三部分)

六. 配置 Quartz RMI 选项

当通过 RMI 使用 Quartz 启动一个 Quartz 实例时,你需要把它配置为经由 RMI "导出" 服务。然后你就能创建客户端,配置它们的 Quartz Scheduler 作为 "代理" 工作而连接到服务端来。表 A.3 列出了可用的 RMI 设定。

表 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 Job Scheduling Framework[翻译]附录 A. Quartz 配置参考 (第二部分)

二. 配置 Quartz ThreadPool

表 A.2 列出了配置 Quartz ThreadPool 可用的属性。只有少些属性是必须的,剩下的都有合理的默认值。

表 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

阅读全文 >>

Quartz Job Scheduling Framework[翻译]附录 A. Quartz 配置参考 (第一部分)

附录 A. Quartz 配置参考

本附录编写作为配置一个 Quartz 应用的快速参考。尽管这些信息在 Quartz 文档中都有,但是这个附录提供了一种更快的方式来查找配置属性和它们可能的值。

一. 主要的 Quartz 属性

表 A.1 列出了主要的 Scheduler 属性。它们用于声明和标识 Scheduler 和其他高层次的设置。 阅读全文 >>