2005年02月17日

http://whyitbe.blogchina.com

可以看看老大的诗词,

也可以看看老大的人生随笔,

还可以看看我们在F组的日子——那段good old days…

2004年08月13日

Mac OS X的确很好玩。不仅有漂亮的GUI,更重要的是他底层的Darwin(Unix)内核,使他成为一个非常健壮的系统。如果Apple可以将他做得更开放,不止运行于Apple硬件平台,我想这个Mac OS X应该可以成为最受欢迎的Unix/Linux桌面系统。

因为他的Unix内核,Mac OS X支持了非常多的Unix工具,许多软件移植到Mac OS X也不是太难的事了,所以众多软件厂商开始将目光投向了这一操作系统。加上Microsoft在Apple也有股份,Mac OS X上的软件越来越多,如Office 2004/Eclipse/JBuilder/JDevelper等等——当然,包括Oracle Database 10g。

Oracle Database 10g for Mac OS X还只是一个早期试用版,不过这不妨碍开发人员高兴的在自己的Mac上摆弄起来。这个试用版安装时候有好些问题,我断断续续花了好几天时间才总算把他装好。

基本上,Mac上的安装步骤和Linux/Unix上类似,总的来说还是创建用户/组,创建目录,修改系统参数,用oracle登录运行oui,直至结束。安装时最好按照Install guide一步步往下进行,只是要注意几个问题,在这里列一下:

1.安装Oracle Database 10g Early Adopter(10.1.0.3) for Mac OS X需要有Mac OS X 10.3.4(panther),和Xcode 1.2。我开始没注意,Xcode只是1.1版本,安装时出现一大堆link error,其实是因为gcc 3.3的build号低了(需要的是gcc 3.3 build 1635或以上)。还有Xcode 1.2带有Oracle 10g需要的jvm1.4.2。

2.Mac OS X默认关闭了root用户,要先用Netinfo Manager将其打开,才能登录root。

3.使用静态ip,并修改/etc/hosts,加入ip, hostname对。不然安装过程中会一直弹出cannot determine host ip的错误窗口。

4.安装的最后一步,Oracle Universal Installer会在$ORACLE_HOME下生成一个root.sh脚本。这个脚本有很多问题,主要是ORATABLOC和一些常用命令的路径设置不对。你可以从这里下载一个已经修正这些错误的文件替换它(记得修改一下这个文件中的ORACLE_HOME路径再以root用户运行)。root.sh会用到一个crsctl脚本,这个脚本也有错,修改/bin/uname为/usr/bin/uname即可。最好再创建/opt目录,让脚本运行更顺利。

注意这些问题,应该可以轻松为你的Mac装上Oracle 10g了。sqlplus/dbca/netca/dbstart/dbshut/emca/emctl dbconsole都没什么问题。

附上两张Oracle 10g for Mac OS X的贴图:

1。

2。

最后补充一下:如果安装使用中遇到什么问题,登录OTN Apple forum提问吧。Enjoy the adventure!

 

2004年08月12日

前几天看到itpub上一个帖子,介绍将Forms Service10g的servlet发布到Tomcat的成功经验。我照做了一下,差不多成功了。我相信这是可行的,虽然觉得意义不大。

有兴趣可以看看:http://www.itpub.net/241425.html

 

2004年08月09日

SQLMonitor是TOAD 7.5带的一个工具。利用它可以监视本地进程通过SQL*Net发送的SQL语句,非常方便。没有它之前,只能在sqlnet.ora文件中设置trace_level_client,trace_file_client等参数,生成trc文件。尽管Oracle有分析trc文件的命令行工具,但这个方法总是太笨拙了。

下面举一个利用SQLMonitor分析Forms事务控制机制的例子。

1.首先打开SQLMonitor。

2.打开Forms Builder,运行一个Form。然后回到SQLMonitor,按5刷新,左边的process列表将出现一个ifdbg60.exe进程。选中其左边的checkbox,即可监视这个应用程序通过SQL*Net发送的语句了。

3.在Form Runtime中执行一下查询。

4.回到SQLMonitor,可以看到刚才Forms执行查询实际发送的SELECT语句。

5.再Form中修改一行记录,将Sales部门的地址改为SHENZHEN。回过头来,在SQLMonitor中可以看到Forms立即对数据库相应行作了锁定。——我们的block的lock mode属性设为automatic,也就等于immediate。

6.在Forms Runtime中保存。可以在SQLMonitor中看到Forms首先发出一个savepoint,然后update修改的行,最后commit。

 

从上面可以看到SQLMonitor的方便了吧:)利用这个工具不仅可以分析Forms,还可以帮助分析很多有用的程序。

ps:我想找一个可以分析jdbc thin driver的工具,不知道有没有?

 

2004年08月07日

Oracle 9i开始,创建数据库时默认包含了XDB特性。一旦启动了数据库和Listener,Oracle XDB的http服务就占用8080端口,刚好和JBoss、Tomcat等默认端口冲突。因此,必须有一个做出更改。改Tomcat等容易,只是一时不知道怎么改XDB的配置。

在Google上搜索一下,找到了答案。原来Oracle XDB的端口设置不在配置文件中,而是在数据库里。修改XDB的http和ftp服务端口的方法有3种:

1。使用sys登录Oracle,利用dbms_xdb修改端口设置

  SQL> — Change the HTTP/WEBDAV port from 8080 to 8081
  SQL> call dbms_xdb.cfg_update(updateXML(
    2        dbms_xdb.cfg_get()
    3      , ‘/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()’
    4      , 8081))
    5  /

  Call completed.

  SQL> — Change the FTP port from 2100 to 2111
  SQL> call dbms_xdb.cfg_update(updateXML(
    2         dbms_xdb.cfg_get()
    3       , ‘/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()’
    4       , 2111))
    5  /

  Call completed.

  SQL> COMMIT;

  Commit complete.

  SQL> EXEC dbms_xdb.cfg_refresh;

  PL/SQL procedure successfully completed.

2。使用OEM console,选择数据库,XML Database,Configuration。更改XDB的有关设置。

3。去掉数据库的初始化参数:  dispatchers=’(PROTOCOL=TCP) (SERVICE=XDB)’,将会禁止XDB的http和ftp服务。

这篇文档很详细解释了XDB的端口设置问题。

 

2004年08月02日

Oracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。
DML lock又可以分为row lock和table lock。row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table
in

name来显示锁定。

如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。(X)这个锁定模式级别最高,并发度最小。

如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX)

如果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。(S)

还有两种锁定模式,row share(RS)和row exclusive(RX)。他们允许的并发操作更多,一般直接用DML语句自动获得,而不用lock语句。

详细参考concepts文档中的”Type Of Locks”:http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2937

2004年07月26日

今天用分析函数ROW_NUMBER解决了一个小小的SQL问题,它可以完成分组排序取序号的功能。用法非常便利,特地用个例子记录下来。这个功能如果不用分析函数,恐怕就只有用PL/SQL了。还不知到如何用标准SQL实现,不想了。

SQL> CREATE TABLE t1
  2  (a NUMBER,
  3   b NUMBER,
  4   c DATE);

Table created.

SQL> INSERT INTO t1 VALUES (2, 2, ‘01-JAN-2004′);

1 row created.

SQL> INSERT INTO t1 VALUES (2, 2, ‘02-JAN-2004′);

1 row created.

SQL> INSERT INTO t1 VALUES (2, 2, ‘03-JAN-2004′);

1 row created.

SQL> INSERT INTO t1 VALUES (2, 1, ‘01-JAN-2004′);

1 row created.

SQL> INSERT INTO t1 VALUES (1, 2, ‘01-JAN-2004′);

1 row created.

SQL> INSERT INTO t1 VALUES (1, 2, ‘02-JAN-2004′);

1 row created.

SQL> INSERT INTO t1 VALUES (1, 3, ‘03-JAN-2004′);

1 row created.

SQL> INSERT INTO t1 VALUES (1, 3, ‘03-JAN-2004′);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT a, b, c, ROW_NUMBER() OVER (PARTITION BY a, b ORDER BY c) num
  2  FROM t1;

         A          B C                NUM                                     
———- ———- ——— ———-                                     
         1          2 01-JAN-04          1                                     
         1          2 02-JAN-04          2                                     
         1          3 03-JAN-04          1                                     
         1          3 03-JAN-04          2                                     
         2          1 01-JAN-04          1                                     
         2          2 01-JAN-04          1                                     
         2          2 02-JAN-04          2                                     
         2          2 03-JAN-04          3                                     

8 rows selected.

 

2004年07月21日

今天我们组老大提交了辞职信。

我可以理解他的伤心。多好的一个团队啊,就这样在它达到一个坚实的里程碑的时候被拆散了。我们怀着做最好、最有挑战性的软件产品的目的来到这里,可是谁能想到现在变成这样?

他说抱歉,因为他没有尽到团队领导者的责任,保全这个团队。他只对我们曾经共同思考的一个问题,说了几句话。

“程序员的自我修养”,那就是——

1。独立思考

2。谦卑之心

3。简洁之道

4。大局观

5。清晰阐述

说得非常好。在这里祝愿他一路走好!

 

2004年04月06日

PL/SQL中的三种集合类型:INDEX-BY TABLE、NESTED TABLE和VARRAY,各有各的特点。

Index-By Table是最早出现的集合类型,也叫PL/SQL Table。他的索引由使用者设定,索引可以为负或0,不用连续。集合变量可以不用初始化。Index-By Table不能作为数据库类型。

Nested Table和VARRAY可以创建为数据库类型,作为字段类型。他们都需要初始化才能引用,集合空间需要扩展才能插入元素。索引从1开始,在插入元素时自动递增。他们的区别是:Nested Table没有最大限制,VARRAY有;Nested Table可以是稀疏的,VARRAY总是密集的;Nested Table保存在数据库中(与之相反是PL/SQL程序中)不保留顺序和下标,VARRAY保留。

TODO:Oracle的JDBC driver是否提供了这三种集合类型的对应JDBC type,可以在调用数据库存储过程时传递集合类型参数?

 

[update]

我没有找到可以在用JDBC调用存储过程时传递PL/SQL集合类型参数的方法。如果参数是数据库类型(Create type ….),Oracle JDBC driver倒是支持。

 

 

2004年03月31日

PL/SQL中可以通过隐式游标的属性(SQL%ISOPEN,SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT)来检查最近一次SQL语句的执行情况。但是,这是PL/SQL的一个语法结构,不是数据库的!

在SQL*Plus中就可以看到,执行一条SQL语句,再执行一个PL/SQL块:

BEGIN IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('TRUE'); ELSIF NOT SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('FALSE'); ELSIF SQL%FOUND IS NULL THEN DBMS_OUTPUT.PUT_LINE('NULL'); END IF; END; 

结果输出仍然是NULL。这说明在PL/SQL块外部的SQL语句不会影响隐式游标。如果将SQL语句移到PL/SQL块里面,SQL%FOUND就有值了。而且,如果在SQL*Plus中先后执行两个PL/SQL块,前一个的SQL执行也不会影响后一块的隐式游标。

在Forms中情况也是一样的。因为每个Trigger的代码其实只是一个PL/SQL块,所以隐式游标的生命周期只在Trigger一级。每次Trigger执行,隐式游标都将重新初始化。所以你不能在Trigger A中作SQL,在Trigger B中检查上次SQL语句的执行情况。

?