Recently in oracle experiences Category

我在"如何在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 版的存储过程调用不支持字符串文字

 

呵呵,很搞的错误提示。

Oracle中如何dump内存中的块

| No Comments | No TrackBacks

oracle里,假如我们去dump一个快,我们通常都会用到alter system dump datafile XXX block XXX,当你执行上述命令的时候,oracle会这么做:

首先判断一下你要dump的这个block是否在buffer cache中,如果在,则buffer cache中这个block的内容就会是你的dump文件中的内容,这时候oracle不会产生实际的物理I/O去相应的datafile中读这个block(所以这里有可能会存在不一致的情况,这种情况用BBED非常容易模拟);如果不在,oracle会产生实际的物理I/O去相应的datafile中读这个block,读到的内容就是你的dump文件中的内容,注意此时oracle不会把读到的那个block缓存在buffer cache中。

 

那么问题来了,oracle里有没有纯粹的不产生物理I/O,而只是从buffer cachedump缓存在其中的block的内容的方法呢?

 

答案是有的,如下的两条语句联合使用就可以达到上述目的了:

alter session set events 'immediate trace name set_tsn_p1 level <tablespace#+1>';

alter session set events  'immediate trace name buffer level <RDBA>';

这里的tablespace#是指ts$中的ts#

RDBA需要自己做一下转换,比如

SQL> exec sys.cdba('01000020','H');

.

The file is 4

The block is 32

这里datafile number4,用10位长度的bit表示就是0000 0001 00

这里block number32,用22位长度的bit表示就是 00 0000 0000 0000 0010 0000,所以这里拼起来的8位长度byte表示的RDBA就是01000020

 

我们来看一个实际的例子:

SQL> oradebug setmypid

Statement processed.

SQL> alter session set events 'immediate trace name set_tsn_p1 level 5';

 

Session altered.

 

SQL> alter session set events  'immediate trace name buffer level 0x01000020';

 

Session altered.

 

SQL> oradebug tracefile_name;

/u01/app/oracle/admin/ipratest/udump/ipratest_ora_6771106.trc

 

$ cat /u01/app/oracle/admin/ipratest/udump/ipratest_ora_6771106.trc

/u01/app/oracle/admin/ipratest/udump/ipratest_ora_6771106.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

......省略显示部分内容

Dump of buffer cache at level 10 for tsn=4, rdba=16777248

BH (700000018f8d2e8) file#: 4 rdba: 0x01000020 (4/32) class: 1 ba: 7000000182ba000

  set: 3 blksize: 8192 bsi: 0 set-flg: 2 pwbcnt: 0

  dbwrid: 0 obj: 51147 objn: 51147 tsn: 4 afn: 4

  hash: [700000084fa03d8,7000000bc9292e0] lru: [700000084fa0458,70000006cf86c58]

  lru-flags: on_auxiliary_list

  ckptq: [NULL] fileq: [NULL] objq: [NULL]

  st: FREE md: NULL tch: 0

  flags:

  Buffer contents not dumped

这里我们可以看到,因为0x01000020不在buffer cache中,所以dump出来的内容为空。

 

SQL> select empno,ename,dbms_rowid.rowid_relative_fno(rowid)||'_'||dbms_rowid.rowid_block_number(rowid) location from scott.emp;

 

EMPNO ENAME      LOCATION

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

 7369 SMITH      4_32

 7498 CUIHUA     4_32

......省略显示部分内容

 7934 MILLER     4_32

 

12 rows selected

 

SQL> oradebug setmypid

Statement processed.

SQL> alter session set events 'immediate trace name set_tsn_p1 level 5';

 

Session altered.

 

SQL> alter session set events  'immediate trace name buffer level 0x01000020';

 

Session altered.

 

SQL> oradebug tracefile_name;

/u01/app/oracle/admin/ipratest/udump/ipratest_ora_3747844.trc

 

$ cat /u01/app/oracle/admin/ipratest/udump/ipratest_ora_3747844.trc

/u01/app/oracle/admin/ipratest/udump/ipratest_ora_3747844.trc

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

......省略显示部分内容

*** SESSION ID:(398.232) 2010-02-20 16:36:35.170

Dump of buffer cache at level 10 for tsn=4, rdba=16777248

BH (700000066f9f608) file#: 4 rdba: 0x01000020 (4/32) class: 1 ba: 7000000664de000

  set: 3 blksize: 8192 bsi: 0 set-flg: 2 pwbcnt: 0

  dbwrid: 0 obj: 51147 objn: 51147 tsn: 4 afn: 4

  hash: [700000018f8d2e8,7000000bc9292e0] lru: [700000048f7c698,700000031f94738]

  ckptq: [NULL] fileq: [NULL] objq: [700000048f7c708,7000000b81495f0]

  st: XCURRENT md: NULL tch: 1

  flags: only_sequential_access

  LRBA: [0x0.0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]

  buffer tsn: 4 rdba: 0x01000020 (4/32)

  scn: 0x0008.aa1369dd seq: 0x02 flg: 0x06 tail: 0x69dd0602

  frmt: 0x02 chkval: 0x4021 type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x07000000664DE000 to 0x07000000664E0000

7000000664DE000 06A20000 01000020 AA1369DD 00080206  [....... ..i.....]

......省略显示部分内容

7000000664DFFE0 49544805 434C4552 4B03C250 030777B4  [ITH.CLERK..P..w.]

7000000664DFFF0 0C110101 0102C209 FF02C115 69DD0602  [............i...]

Block header dump:  0x01000020

 Object id on Block? Y

 seg/obj: 0xc7cb  csc: 0x08.aa1369db  itc: 2  flg: E  typ: 1 - DATA

     brn: 0  bdba: 0x1000019 ver: 0x01 opc: 0

     inc: 0  exflg: 0

 

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

0x01   0x0003.00a.000016a6  0x01c003e0.03aa.05  --U-    1  fsc 0x0000.aa1369dd

0x02   0x0001.023.00001129  0x020005e7.0307.03  C---    0  scn 0x0008.aa136850

 

data_block_dump,data header at 0x7000000664de064

===============

tsiz: 0x1f98

hsiz: 0x2e

pbl: 0x7000000664de064

bdba: 0x01000020

     76543210

flag=--------

ntab=1

nrow=14

frre=2

fsbo=0x2e

fseo=0x1aa7

avsp=0x1d88

tosp=0x1d88

0xe:pti[0]      nrow=14 offs=0

0x12:pri[0]     offs=0x1b2a

0x14:pri[1]     offs=0x1aa7

0x16:pri[2]     sfll=9

......省略显示部分内容

0x2c:pri[13]    offs=0x1d3a

block_row_dump:

tab 0, row 0, @0x1b2a

tl: 38 fb: --H-FL-- lb: 0x0  cc: 8

col  0: [ 3]  c2 4a 46

col  1: [ 5]  53 4d 49 54 48

col  2: [ 5]  43 4c 45 52 4b

col  3: [ 3]  c2 50 03

col  4: [ 7]  77 b4 0c 11 01 01 01

col  5: [ 2]  c2 0b

col  6: *NULL*

col  7: [ 2]  c1 15

......省略显示部分内容

end_of_block_dump

BH (700000018f8d2e8) file#: 4 rdba: 0x01000020 (4/32) class: 1 ba: 7000000182ba000

  set: 3 blksize: 8192 bsi: 0 set-flg: 2 pwbcnt: 0

  dbwrid: 0 obj: 51147 objn: 51147 tsn: 4 afn: 4

  hash: [700000084fa03d8,700000066f9f608] lru: [700000084fa0458,70000006cf86c58]

  lru-flags: on_auxiliary_list

  ckptq: [NULL] fileq: [NULL] objq: [NULL]

  st: FREE md: NULL tch: 0

  flags:

  Buffer contents not dumped

可以从上述测试中看到,0x01000020buffer cache中的时候,我们用上述两条语句成功dump出了buffer cache0x01000020的内容。

Recent Comments

  • denver computer repair: This blog truly keeps getting better every time I see read more
  • sniperwd: 期待周末的分享~~ read more
  • cui hua: 谢谢:) read more
  • jlttt: 我挺你~~ read more
  • Kostas Hairopoulos: Your response was really excellent. I really appreciated it. I read more
  • cui hua: 谢谢:) read more
  • ochef: 一如继往的支持你! read more
  • eygle: 尽快确定题目吧,我更新过去! read more
  • ning.wang: 英语这个工具也是起了相当大的作用。呵呵 read more
  • cui hua: 我终于明白x$kcbwds,x$kcbwbpd以及上述蓝色字体标注的含义了。 read more

About this Archive

This page is an archive of recent entries in the oracle experiences category.

my life is the previous category.

other experiences is the next category.

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