March 2010 Archives

技术可以让生活更美好

| 16 Comments

"技术可以让生活更美好"----这个题目太夸张了,但是当我看到我把库起起来后朋友客户的DBA一把抓住我的手,激动万分的时候,我真的就是这么想的......

 

朋友客户的一个库,非归档、无备份,因为在做recovery的时候的误操作,导致crash后再也无法打开,alert log里的ORA-00600[4000]触目惊心:

Tue Mar 23 19:27:45 2010

Errors in file /oracle/dev/oracle/product/10.2.0/db_1/admin/CRMDEV/udump/crmdev_ora_4333.trc:

ORA-00704: bootstrap process failure

ORA-00704: bootstrap process failure

ORA-00600: internal error code, arguments: [4000], [6], [], [], [], [], [], []

Tue Mar 23 19:27:45 2010

Error 704 happened during db open, shutting down database

USER: terminating instance due to error 704

Instance terminated by USER, pid = 4333

ORA-1092 signalled during: alter database open...

  

       这个问题纠结了好几天,朋友客户找来了好多人看过这个库,但都没有搞定。朋友客户的DBA还是位女同志,就因为这个连续好几天失眠。

       无奈之下朋友客户找到了我朋友,我朋友又找到了我。

  

       当我晚上赶到现场后仔细检查了各个datafile,发现并没有被覆盖,我对她说:"恭喜你,你的数据库有救了"。

 

熊哥,我下午给你打电话就是想跟你讨论这个问题,我准备了三套方案,但是可惜,这个库连让我用BBED的机会都没有给就被我直接打开了,我这里用到了你的原创方法,未经你的同意,细节我就不发布了。

 

朋友客户的DBA跟我说:"这个问题我找了好多人,最后都不行,无奈之下只好给eygle打了电话,可惜eygle人在上海,但是他答应我回北京后帮我看看"。

 

我对她说:"你可以告诉eygle,我帮你把这个库打开了,eygle认识我。"

她说:"啊!eygle认识你啊?"

   我说是的,eygle真的认识我。

ACOUG

| 7 Comments

eyglekamus两位大师合作创建了ACOUGAll China Oracle User Group-中国Oracle用户组

对于ACOUGkamus这样说:

"我们希望能够为全中国的Oracle技术爱好者提供一个交流与活动的平台,我们希望能够激发更多人对于Oracle技术以及相关知识的兴趣,我们希望沉浸在这些技术中的人员获得更多的乐趣。这是我跟eygle一直以来的一个理想,但愿我们能为此付出并且有所回报"

 

eygle则这样解释"回报"二字:

另外一个问题是,很多人不愿意为没有收益的事情付出,而我的观点是,有付出一定是有回报的,虽然这个回报可能在很久之后。

 

说来也巧,我这几年真的就是这么想的----我深陷其中,是因为我从学习oracle的过程中不断能体会到乐趣(不为别的,就是觉得很爽),我也坚信付出必有回报!

 

这次有幸得到两位大师提携,能够和两位大师一起在ACOUG的第一次活动中做一个主题演讲,我的初步设想是会围绕"oracle如何深入"这个主题来展开,希望能不辱使命

oracle里如何调用db2 v9上的存储过程

| 2 Comments

我在"如何在oracle里使用java存储过程连接db2"这篇文章里已经提到过如何在oracle里用java存储过程连db2 v9 for z/OS,并且我在里面举了用java存储过程在db2 v9 for z/OS上执行一条sql的例子,这篇文章其实就是上述文章的延续,在这篇文章里,我们完整的做了一个调用db2 v9 for z/OS上存储过程的例子

 

我们的目的是要调用存储过程XBAIPA.CAAUD,这个存储过程有一个输入参数和一个输出参数,其中输入参数是一个字符串,输出参数也是一个字符串。

 

注意这里安装完transparent gateway后虽然能连上db2 v9 for z/OS,但是不能执行其中的存储过程,如下所示:

SQL> select deptname from DSN8910.DEPT@PLHI3 where deptno='A00';

 

DEPTNAME

------------------------------------------------------------------------

SPIFFY COMPUTER SERVICE DIV.

 

SQL> var temp varchar2(32767);

SQL> set serveroutput on size 1000000;

SQL> begin

  2  XBAIPA.CAAUD@PLHI3('A 9999992581970687034 NBEUR    1232542102008120220091222 LEENEN/WERNER MR                               5BJ9B9/1A NON-RER REF FEE MAY APPLY    BR0.114200                   0000000019000000000001900000000000190000000000293000000000000Y  0 0N00000000000H',:temp);

  3  end;

  4  /

 

begin

XBAIPA.CAAUD@PLHI3('A 9999992581970687034 NBEUR    1232542102008120220091222 LEENEN/WERNER MR                               5BJ9B9/1A NON-RER REF FEE MAY APPLY    BR0.114200                   0000000019000000000001900000000000190000000000293000000000000Y  0 0N00000000000H',:temp);

end;

 

ORA-06550: line 2, column 1:

PLS-00201: identifier 'XBAIPA.CAAUD@PLHI3' must be declared

ORA-06550: line 2, column 1:

PL/SQL: Statement ignored

temp

---------

 

为什么不能执行上述存储过程的原因我已经在上述文章里说过了。

 

现在我们来看怎样才能成功调用上述存储过程:

在把JDBC for db2的驱动加载到oracle里后首先创建所需的java存储过程:

SQL> create or replace and compile java source named call_db2 as

  2  import java.sql.*;

  3  import oracle.jdbc.*;

  4  import java.io.*;

  5  import java.lang.*;

  6 

  7  public class call_db2

  8  {

  9    public static String call_db2_procedure_type_1(String ProcedureName, String InputString)

 10    {

 11       Connection conn = null;

 12       CallableStatement proc = null;

 13       String callname = null;

 14       String OutputString = null;

 15 

 16          try

 17          {

 18            DriverManager.registerDriver(new com.ibm.db2.jcc.DB2Driver());

 19            conn = DriverManager.getConnection("jdbc:db2://10.1.21.215:446/LOCDSN3", "xbalhu", "abcd");

 20 

 21            //执行一个db2存储过程----------begin------------------------------

 22            callname = "{CALL " + ProcedureName + "(?,?)}";

 23            proc = conn.prepareCall(callname);

 24            proc.setString(1, InputString);

 25            proc.registerOutParameter(2, Types.VARCHAR);

 26            proc.execute();

 27            OutputString = proc.getString(2).substring(1,2000);

 28            //执行一个db2存储过程----------End--------------------------------

 29          }

 30          catch(Exception e)

 31          {

 32            e.printStackTrace();

 33            OutputString = "Error Occur: " + e;

 34          }

 35          finally

 36          {

 37            try

 38            {

 39              if(proc != null)

 40              {

 41                proc.close();

 42              }

 43 

 44              if(conn != null)

 45              {

 46                conn.close();

 47              }

 48            }

 49            catch(Exception ex)

 50            {

 51            }

 52          }

 53 

 54          return OutputString;

 55    }

 56  }

57  /

 

Java created

 

接着创建wrapper function

SQL> CREATE OR REPLACE Function F_SYS_CALL_DB2_PROC(ProcedureName varchar2, InputString varchar2)

  2    return varchar2

  3      as language java

  4        name 'call_db2.call_db2_procedure_type_1(java.lang.String, java.lang.String) return java.lang.String';

  5  /

 

Function created

 

好了,现在我们可以来测一下最后的效果了:

SQL> var temp varchar2(32767);

SQL> set serveroutput on size 1000000;

SQL> begin

  2  :temp := f_sys_call_db2_proc('XBAIPA.CAAUD','A 9999992581970687034 NBEUR    1232542102008120220091222 LEENEN/WERNER MR                               5BJ9B9/1A NON-RER REF FEE MAY APPLY    BR0.114200                   0000000019000000000001900000000000190000000000293000000000000Y  0 0N00000000000H');

  3  end;

  4  /

 

PL/SQL procedure successfully completed

temp

---------

0000000000000+0000000000000+0000000000000+0000000000000 Y

 

从结果里可以看到,我们已经在oracle里成功调用了db2 v9 for z/OS中的存储过程。

 

上述蓝色字体标注的部分格式不能错,否则oracle可能会报错:

com.ibm.db2.jcc.c.SqlException: [ibm][db2][jcc][10243][10940] DB2 z/OS 版的存储过程调用不支持字符串文字

 

呵呵,很搞的错误提示。

Recent Comments

  • 毕业论文: 学习了。 read more
  • cui hua: 不用改数据,你改row directory里的指针就可以了——这就是我文中提到的update internal。 read more
  • yangjiawei: 领导,不好意思,再请问一下 我现在遇到一个问题,我现在已经将ind$里两个索引的状态改好了,数据库也拉起来了~! 但是在修改obj$里name里为DEPENDENCY$这一行数据的data_object_id时遇到了困难,因为他原先的长度为2个字节,现在由于我move了一下,他的长度变成了4个字节,结果如下: 原先: col 1[2] @906: 0xc1 0x5d ==>92 read more
  • cui hua: 可以从上述sql中推断出等待的顺序(如何推断我已经在文中提到了),是不是太直观,但是综合上述症状来看,只有我文中提到的这种可能。 read more
  • yangjiawei: 我最近也正好再研究这些比较Internal的东西,所以想麻烦您能对这个问题写一个比较详细的解释及解决方案,我对这些也是比较感兴趣的,可以吗? read more
  • publover: 好文,但是不明白是如何确定这个等待队列的?否则就无法看出是谁阻塞了谁,但是从SQL中看不出来等待的顺序是什么 read more
  • cui hua: 这些东西过于internal和复杂了,我不打算对外发布,误导了你反而不好。做好备份就可以了,有了完善的备份这些手段都是没有意义的。 read more
  • yangjiawei: 领导啊~能否将详细的处理过程写一份,发给我啊?我很期待能跟您学习一下~!:) read more
  • cui hua: 这个就是128 128 0 read more
  • cui hua: kamus,你是对的。但我这里指的是一种极限情况,其实我也觉得我这里的算法可能是有问题的。 read more

About this Archive

This page is an archive of entries from March 2010 listed from newest to oldest.

February 2010 is the previous archive.

April 2010 is the next archive.

Find recent content on the main index or look in the archives to find all content.