来源:网海拾贝
商定:
1、若是出现 java.lang.UnsatisfiedLinkError: do_open,则你需求把 DriverManager.getConnection() 设施的 url 修正成 jdbc:oracle:thin:@127.0.0.1:1521:oradb,详细原因未知;
2、若是出现 java.sql.SQLException: 不撑持的字符集: oracle-character-set-852,则你需求把 nls_charset12.zip插足你的工程中(此文件与 > 上面我就把文件夹samplesoci8object-samples下的文件做一个详细的功能描绘:
1、PersonObject.java
这个例子演示了表 people 中存在ADT字段 empid,其类型为 PERSON,而且类型 PERSON中存在ADT字段 home,其类型为 ADDRESS,而且类型 ADDRESS是一个ADT。
若是哄骗通例SQL语句,其拔出语句与在sql/plus中无异,即:哄骗组织函数嵌套组织。
另有一种设施,哄骗 STRUCT 的组织函数 STRUCT(StructDescriptor, Connection, Object[]) 组织出一个STRUCT工具,即一个ADT工具。同时,若是有嵌套则需求嵌套组织ADT工具。最初经过 PreparedStatement的 setObject设施指定ADT工具即可。
读取数据时则给与与上述设施相逆的设施:若是是巨大类型,则间接读取;若是是ADT,则哄骗ResultSet的getObject(),再强制转换成STRUCT,然后挪用STRUCT的getAttributes()设施取得 Object[] 类型数据,如是递归。
2、SQLDataExample.java与EmployeeObj.java
此例与1中类似,也是对ADT的处置赏罚,分歧的是类型没有嵌套。
角力计算而言,2比1的代码简练了很多,不外也是支付了代价:为类型 EMPLOYEE 笼统出一个类EmployeeObj,它完成了SQLData接口,着重写了三个设施(必需的)。
前台的挪用比1中的第二种设施简练了很多,只需求间接哄骗PreparedStatement的 setObject设施指定ADT工具即可(不外需求指定其类型为OracleTypes.STRUCT)。读取时也可间接哄骗OracleResultSet的getObject()并强制转换成EmployeeObj工具即可。
真可谓是:有得必有失!!
另,此例中有几处需求留意的中央:
2.1 EmployeeObj.java中的 import oracle.jdbc2.*; 改成 import oracle.jdbc.*; 原因未知;
2.2 SQLDataExample.java 中的 Dictionary map = conn.getTypeMap(); 改成 java.util.Map map = conn.getTypeMap(); 原因:NOTE: This > 2.3 SQLDataExample.java 中的 pstmt.executeQuery(); 改成 pstmt.executeUpdate(); 更公平些,由于这是更新而非盘考(不改也不会影响功能,只是倡导);
3、CustomDatumExample.java与Employee.java
此例与2完全类似。分歧的是给与了别的一种笼统技术,并完成了接口CustomDatum 与 CustomDatumFactory,着重写了二个设施toDatum()与create()。在前台拜访数据时亦有少许分歧:给与了OracleResultSet的getCustomDatum()设施并把它强制转换成Employee。从外不雅上看,2中SQLData接口存在于 java.sql.* 包中;而接口CustomDatum 与 CustomDatumFactory则存在于oracle.sql.*包中,可以认为是Oracle公司对自己产物的专门完成。约莫有更高的功能、更小的开支?不外3不如2来得间接,小我私人认为。
4、ArrayExample.java
从文件名可看出,此示例演示的是VARRAY类型。
同1,拔出亦有两种设施。一种可间接哄骗SQL;别的,可哄骗OraclePreparedStatement的setARRAY设施,组织ARRAY的过程与组织 STRUCT 无异。数据的读取过程与此相反:先哄骗OracleResultSet的getARRAY()设施取得ARRAY工具,再挪用此工具的getArray()设施并强制转换成工具数组,然后对此数组把持即可。
5、PersonRef.java与StudentRef.java
不知是不是ORACLE与我们开玩笑,这两个文件除了类名分歧外,别的无缺绝对类似。
这个例子给我们演示的是工具表的不雅点。工具表的拔出与泛泛表没有任何分歧,数据的读取首先表今朝其SQL上,需求哄骗REF函数,然后挪用ResultSet的getObject()设施并强制转换成REF工具,再哄骗此工具的getValue()并转换成STRUCT工具,再哄骗此工具 的getAttributes()设施取得Object[],然后对此数组把持即可。
6、RefClient.java与GenREF.java
This sample demonstrates using REF over two different Sessions.
类GenREF用来封装REF工具所指向的类型及其二进制内容。按次先Materialize into GenREF,然后在另一会话中De-materialize REF from GenREF,上面就与处置赏罚REF类似:哄骗此工具的getValue()并转换成STRUCT工具,再哄骗此工具 的getAttributes()设施取得Object[],然后对此数组把持即可。
7、FileExample.java与PLSQL_FileExample.java
此示例哄骗 BFILE 数据类型,Contains a locator(定位器) to a large binary file stored outside the database。数据拔出时需求哄骗函数 bfilename,这个函数需求目次工具,此工具需求哄骗create directory mydir来建树(此用户需具有CREATE ANY DIRECTORY琐细权限)。我曾在这此中央有个大经验:按着步骤做,可在读取时老是提示我没有此目次!!最初,我把BFILENAME函数的第一个参数(即目次名)大写就好了。原因:目次名在函数中区分巨细写,固然我们建树它时用的是小写,可到了数据库中后就自动酿成了大写。
读取BFILE类型的数据时,首先经过其getBinaryStream()设施取得二进制的输出流,然后把持这个输出流就可以了。The limitation is your imagination。
PLSQL_FileExample.java完成的功能与上述的类似,只不外全部针对BFILE的把持都是经过挪用pl/sql匿名块来完成的,并哄骗了OracleCallableStatement。若是没有必要,哄骗前者即可。
8、LobExample.java与PLSQL_LobExample.java
此示例哄骗了CLOB和BLOB数据类型。
拔出数据时,需求分别经过getBinaryOutputStream()和getCharacterOutputStream()取得二进制输出流和字符输出流,然后即是针对此输出流的把持了,与传统的 java I/O 类似。
读取数据时,需求分别经过getBinaryStream()和getCharacterStream()取得二进制输出流和字符输出流,然后即是针对此输出流的把持了,与传统的 java I/O 类似。
PLSQL_LobExample.java完成的功能与上述的类似,只不外全部针对CLOB和BLOB的把持都是经过挪用pl/sql匿名块来完成的,并哄骗了OracleCallableStatement。若是没有必要,哄骗前者即可。
注:7、8的第二个示例中均哄骗到了dbms_lob按次包。
版权声明: 原创作品,批准转载,转载时请务必以超链接方式标明文章 原始情由 、作者信息和本声明。否则将究查执法责任。