Oracle Data Cartridge InterfaceとDomino Java APIを使用したOracle DatabaseでのLotus Dominoデータの紹介

私たちはそれぞれ、異なるシステムを統合する必要に直面していました。 Oracle DatabaseのSQL select文を使用して、Lotus Dominoデータベースのデータを表示する機能を提供する方法について説明します。 おそらく、このトピックは多くの人にとって興味深いものではないでしょう。 しかし、私の意見では、これら2つの商用製品は、それらが提供する機会について書くに値します。



このトピックを理解したい人は、次の2つのドキュメントを事前に理解しておくことができます。

それらに基づいて、次の例を作成しました。その目的は、OracleクエリでDominoアドレス帳のデータを使用する基本的な可能性を示すことです。 両方のソフトウェア製品がLinuxに標準的な方法でインストールされ、ファイルとアクション自体がディレクトリ/ home / user / java / oracle_dominoに配置され実行されることを前提としています。 必要な追加コメントは、両方のドキュメントに記載されています。



まず、domino_names_odci_mem.java:

 import lotus.domino.*; import java.util.*; import java.io.*; import oracle.sql.*; import java.sql.*; import java.math.*; import oracle.CartridgeServices.*; import java.util.Calendar; import java.text.SimpleDateFormat; public class domino_StoredCtx { //   ,   domino Vector vnames; } //   SQLData,          public class domino_names_odci_mem implements SQLData { private BigDecimal key; final static BigDecimal SUCCESS = new BigDecimal(0); final static BigDecimal ERROR = new BigDecimal(1); //  SQLData String sql_type; public String getSQLTypeName() throws SQLException { return sql_type; } public void readSQL(SQLInput stream, String typeName) throws SQLException { sql_type = typeName; key = stream.readBigDecimal(); } public void writeSQL(SQLOutput stream) throws SQLException { stream.writeBigDecimal(key); } // ODCI: ODCITableStart,ODCITableFetch,ODCITableClose (  ,   ) static public BigDecimal ODCITableStart(STRUCT[] sctx,String param) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); domino_StoredCtx ctx = new domino_StoredCtx(); StructDescriptor outDesc = StructDescriptor.createDescriptor("DOMINO_NAME", conn); Object[] out_attr = new Object[4]; //     10  int nrowsval = 10; ctx.vnames = new Vector(); try { //     domino       lotus.domino.Session session = NotesFactory.createSession("ip_of_domino_server:DIIOP_port","user","password"); lotus.domino.Database db = session.getDatabase("", "names.nsf"); lotus.domino.View vw = db.getView("People"); lotus.domino.Document doc = vw.getFirstDocument(); while(nrowsval>0 && doc != null){ String shortName = doc.getItemValueString("ShortName"); String altFullName = doc.getItemValueString("AltFullName"); lotus.domino.Name name = session.createName(altFullName); String commonName = name.getCommon(); String employeeID = doc.getItemValueString("EmployeeID"); out_attr[1-1] = (Object)new String(shortName); out_attr[2-1] = (Object)new String(commonName); out_attr[3-1] = (Object)new String(employeeID); out_attr[4-1] = (Object)new String(now()); ctx.vnames.add((Object)new STRUCT(outDesc, conn, out_attr)); nrowsval--; doc = vw.getNextDocument(doc); } } catch(Exception e) { e.printStackTrace(); } int key; try { //        ODCITableFetch key = ContextManager.setContext(ctx); } catch (CountException ce) { return ERROR; } Object[] impAttr = new Object[1]; impAttr[0] = new BigDecimal(key); StructDescriptor sd = new StructDescriptor("DOMINO_NAMES_ODCI_MEM",conn); sctx[0] = new STRUCT(sd,conn,impAttr); return SUCCESS; } public BigDecimal ODCITableFetch(BigDecimal nrows, ARRAY[] outSet) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); domino_StoredCtx ctx; try { //    ctx=(domino_StoredCtx)ContextManager.getContext(key.intValue()); } catch (InvalidKeyException ik ) { return ERROR; } // ODCITableFetch  ,      //..  ,     2 ,    ,    if(ctx.vnames==null) return SUCCESS; //     Object out_arr[] = ctx.vnames.toArray(); ArrayDescriptor ad = new ArrayDescriptor("DOMINO_NAMES_TABLE",conn); outSet[0] = new ARRAY(ad,conn,out_arr); // ,       ctx.vnames=null; return SUCCESS; } public BigDecimal ODCITableClose() throws SQLException { domino_StoredCtx ctx; try { ctx=(domino_StoredCtx)ContextManager.clearContext(key.intValue()); } catch (InvalidKeyException ik ) { return ERROR; } return SUCCESS; } //      public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; public static String now() { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); return sdf.format(cal.getTime()); } }
      
      









import lotus.domino.*; import java.util.*; import java.io.*; import oracle.sql.*; import java.sql.*; import java.math.*; import oracle.CartridgeServices.*; import java.util.Calendar; import java.text.SimpleDateFormat; public class domino_StoredCtx { // , domino Vector vnames; } // SQLData, public class domino_names_odci_mem implements SQLData { private BigDecimal key; final static BigDecimal SUCCESS = new BigDecimal(0); final static BigDecimal ERROR = new BigDecimal(1); // SQLData String sql_type; public String getSQLTypeName() throws SQLException { return sql_type; } public void readSQL(SQLInput stream, String typeName) throws SQLException { sql_type = typeName; key = stream.readBigDecimal(); } public void writeSQL(SQLOutput stream) throws SQLException { stream.writeBigDecimal(key); } // ODCI: ODCITableStart,ODCITableFetch,ODCITableClose ( , ) static public BigDecimal ODCITableStart(STRUCT[] sctx,String param) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); domino_StoredCtx ctx = new domino_StoredCtx(); StructDescriptor outDesc = StructDescriptor.createDescriptor("DOMINO_NAME", conn); Object[] out_attr = new Object[4]; // 10 int nrowsval = 10; ctx.vnames = new Vector(); try { // domino lotus.domino.Session session = NotesFactory.createSession("ip_of_domino_server:DIIOP_port","user","password"); lotus.domino.Database db = session.getDatabase("", "names.nsf"); lotus.domino.View vw = db.getView("People"); lotus.domino.Document doc = vw.getFirstDocument(); while(nrowsval>0 && doc != null){ String shortName = doc.getItemValueString("ShortName"); String altFullName = doc.getItemValueString("AltFullName"); lotus.domino.Name name = session.createName(altFullName); String commonName = name.getCommon(); String employeeID = doc.getItemValueString("EmployeeID"); out_attr[1-1] = (Object)new String(shortName); out_attr[2-1] = (Object)new String(commonName); out_attr[3-1] = (Object)new String(employeeID); out_attr[4-1] = (Object)new String(now()); ctx.vnames.add((Object)new STRUCT(outDesc, conn, out_attr)); nrowsval--; doc = vw.getNextDocument(doc); } } catch(Exception e) { e.printStackTrace(); } int key; try { // ODCITableFetch key = ContextManager.setContext(ctx); } catch (CountException ce) { return ERROR; } Object[] impAttr = new Object[1]; impAttr[0] = new BigDecimal(key); StructDescriptor sd = new StructDescriptor("DOMINO_NAMES_ODCI_MEM",conn); sctx[0] = new STRUCT(sd,conn,impAttr); return SUCCESS; } public BigDecimal ODCITableFetch(BigDecimal nrows, ARRAY[] outSet) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); domino_StoredCtx ctx; try { // ctx=(domino_StoredCtx)ContextManager.getContext(key.intValue()); } catch (InvalidKeyException ik ) { return ERROR; } // ODCITableFetch , //.. , 2 , , if(ctx.vnames==null) return SUCCESS; // Object out_arr[] = ctx.vnames.toArray(); ArrayDescriptor ad = new ArrayDescriptor("DOMINO_NAMES_TABLE",conn); outSet[0] = new ARRAY(ad,conn,out_arr); // , ctx.vnames=null; return SUCCESS; } public BigDecimal ODCITableClose() throws SQLException { domino_StoredCtx ctx; try { ctx=(domino_StoredCtx)ContextManager.clearContext(key.intValue()); } catch (InvalidKeyException ik ) { return ERROR; } return SUCCESS; } // public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; public static String now() { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); return sdf.format(cal.getTime()); } }













すべてを準備して表示するシェルスクリプトになりました。

標準のDominoインストールの場合のNCSO.jarは、ディレクトリ/ local / notesdata / domino / javaから取得できます。



 export ORACLE_SID=MYDB #      sqlplus '/as sysdba' <<EOF drop user udomino cascade; / create user udomino identified by "pdomino"; grant connect,resource to udomino; grant create any directory,drop any directory to udomino; exec dbms_java.grant_permission( 'UDOMINO', 'SYS:java.net.SocketPermission', 'ip_of_domino_server:DIIOP_port', 'connect,resolve' ); EOF # Oracle Database      jar,   Domino,         #     , .. Oracle ,      loadjava -user udomino/pdomino -order -resolve -genmissing -verbose -resolver "((* UDOMINO) (* PUBLIC) (* -))" NCSO.jar #         sqlplus -S /nolog <<EOF connect udomino/pdomino drop type domino_names_odci_mem; drop type domino_names_table; drop type domino_name; drop function domino_names; drop java source domino_names_odci_mem_source; drop directory javadir / create type domino_name as object ( shn varchar(20), fio varchar(256), tab_n varchar(20), dt varchar(20) ); / create type domino_names_table as table of domino_name; / create or replace directory javadir as '/home/user/java/oracle_domino'; / create and compile java source named domino_names_odci_mem_source using bfile (javadir,'domino_names_odci_mem.java'); / show errors #   ODCITable create type domino_names_odci_mem as object ( key integer, static function ODCITableStart(sctx in out domino_names_odci_mem,param varchar2) return number as language java name 'domino_names_odci_mem.ODCITableStart(oracle.sql.STRUCT[],java.lang.String) return java.math.BigDecimal', member function ODCITableFetch(self in out domino_names_odci_mem, nrows in number, outSet out domino_names_table) return number as language java name 'domino_names_odci_mem.ODCITableFetch(java.math.BigDecimal, oracle.sql.ARRAY[]) return java.math.BigDecimal', member function ODCITableClose(self IN domino_names_odci_mem) return number as language java name 'domino_names_odci_mem.ODCITableClose() return java.math.BigDecimal' ); / show errors create function domino_names(param varchar2) return domino_names_table pipelined using domino_names_odci_mem; / EOF #      export NLS_LANG=American_America.UTF8 sqlplus -S /nolog<<EOF connect udomino/pdomino set serveroutput on call dbms_java.set_output(1000000); set linesize 160 set pagesize 1000 set feedback off col fio for a50 col tab_n for a10 col shn for a20 col dt for a20 select * from table(domino_names('some_string_param')) order by dt; exit; EOF
      
      









export ORACLE_SID=MYDB # sqlplus '/as sysdba' <<EOF drop user udomino cascade; / create user udomino identified by "pdomino"; grant connect,resource to udomino; grant create any directory,drop any directory to udomino; exec dbms_java.grant_permission( 'UDOMINO', 'SYS:java.net.SocketPermission', 'ip_of_domino_server:DIIOP_port', 'connect,resolve' ); EOF # Oracle Database jar, Domino, # , .. Oracle , loadjava -user udomino/pdomino -order -resolve -genmissing -verbose -resolver "((* UDOMINO) (* PUBLIC) (* -))" NCSO.jar # sqlplus -S /nolog <<EOF connect udomino/pdomino drop type domino_names_odci_mem; drop type domino_names_table; drop type domino_name; drop function domino_names; drop java source domino_names_odci_mem_source; drop directory javadir / create type domino_name as object ( shn varchar(20), fio varchar(256), tab_n varchar(20), dt varchar(20) ); / create type domino_names_table as table of domino_name; / create or replace directory javadir as '/home/user/java/oracle_domino'; / create and compile java source named domino_names_odci_mem_source using bfile (javadir,'domino_names_odci_mem.java'); / show errors # ODCITable create type domino_names_odci_mem as object ( key integer, static function ODCITableStart(sctx in out domino_names_odci_mem,param varchar2) return number as language java name 'domino_names_odci_mem.ODCITableStart(oracle.sql.STRUCT[],java.lang.String) return java.math.BigDecimal', member function ODCITableFetch(self in out domino_names_odci_mem, nrows in number, outSet out domino_names_table) return number as language java name 'domino_names_odci_mem.ODCITableFetch(java.math.BigDecimal, oracle.sql.ARRAY[]) return java.math.BigDecimal', member function ODCITableClose(self IN domino_names_odci_mem) return number as language java name 'domino_names_odci_mem.ODCITableClose() return java.math.BigDecimal' ); / show errors create function domino_names(param varchar2) return domino_names_table pipelined using domino_names_odci_mem; / EOF # export NLS_LANG=American_America.UTF8 sqlplus -S /nolog<<EOF connect udomino/pdomino set serveroutput on call dbms_java.set_output(1000000); set linesize 160 set pagesize 1000 set feedback off col fio for a50 col tab_n for a10 col shn for a20 col dt for a20 select * from table(domino_names('some_string_param')) order by dt; exit; EOF













その結果、以下が出力されます(最後に):

 SHN FIO TAB_N DT -------------------- ------------------------------ ---------- -------------------- user    12305 2011-08-25 11:55:14 ....
      
      









SHN FIO TAB_N DT -------------------- ------------------------------ ---------- -------------------- user 12305 2011-08-25 11:55:14 ....













結果が得られるという事実は、多くの設定手順、特にDominoサーバーの結果です。 つまり ファイルを単に「必要な場所」に置いてシェルスクリプトを実行することは不可能です。 しかし、私が望むのは、提供されたドキュメントへのリンクと例が、彼らが必要とするものを達成するのを助けることができると思います。



All Articles