racle的STRUCT和VARRAY的读写方法

原创 2012年03月21日 20:09:40
 

Oracle的STRUCT和VARRAY的读写方法

巧巧电脑网络 2010-02-25 qqread 佚名   收藏此文 
本文给出了读写oracle的特殊数据类型STRUCT和VARRAY的操作方法。首先,创建类型 CREATE TYPE Struct_Test AS OBJECT(s VARCHAR(30), i NUMBER); CREATE TYPE number_varray AS VARRAY(10) OF NUMBER(12, 2); 然后。
 

  本文给出了读写Oracle的特殊数据类型STRUCT和VARRAY的操作方法

  首先,创建类型

  CREATE TYPE Struct_Test AS OBJECT(s VARCHAR(30), i NUMBER);

  CREATE TYPE number_varray AS VARRAY(10) OF NUMBER(12, 2);

  然后,创建表

  CREATE TABLE test(i NUMBER, obj Struct_Test);

  REATE TABLE VARRAY_TABLE(col_number_array number_varray)

  然后,插入数据

  //插入STRUCT数据

  Object[] values = new Object[]{”str”, new BigDecimal(123)};

  oracle.sql.StructDescriptor structDesc = oracle.sql.StructDescriptor.createDescriptor(”Struct_Test”, cn);

  oracle.sql.STRUCT oracleStruct = new oracle.sql.STRUCT(structDesc, cn, values);

  // Create a prepared statement for insertion into test

  PreparedStatement ps = connection.prepareStatement(”INSERT INTO test VALUES(?,?)”);

  // Set the values to insert

  ps.setInt(1, 123);

  ps.setObject(2, oracleStruct);

  // Insert the new row

  ps.execute();

  //插入VARRAY数据

  // Create an oracle.sql.ARRAY object to hold the values

  oracle.sql.ArrayDescriptor arrayDesc = oracle.sql.ArrayDescriptor.createDescriptor(”number_varray”, connection);

  int arrayValues[] = {123, 234};

  oracle.sql.ARRAY array = new oracle.sql.ARRAY(arrayDesc, cn, arrayValues);

  // Create a prepared statement for insertion into varray_table

  PreparedStatement ps = cn.prepareStatement(”INSERT INTO varray_table VALUES(?)”);

  // Set the values to insert

  ((oracle.jdbc.driver.OraclePreparedStatement)ps).setARRAY(1, array);

  // Insert the new row

  ps.execute();

  最后,读取数据

  //读取STRUCT数据

  ResultSet resultSet = stmt.executeQuery(”SELECT * FROM test”);

  while (resultSet.next()) {

  // Get the Struct_Test value from the second column obj

  oracle.sql.STRUCT oracleStruct = (oracle.sql.STRUCT)resultSet.getObject(2);

  // Get the object1 values from each row

  Object[] values = oracleStruct.getAttributes();

  // Get the first value of object1, which is a string

  String str = (String)values[0];

  BigDecimal i = (BigDecimal)values[1];

  }

  //读取VARRAY数据

  // Create a statement

  Statement stmt = cn.createStatement();

  // Select rows from varray_table

  ResultSet resultSet = stmt.executeQuery(”SELECT * FROM varray_table”);

  // Get the VARRAY values from each row

  while (resultSet.next()) {

  // Get the VARRAY value in the first column

  oracle.sql.ARRAY array = ((oracle.jdbc.driver.OracleResultSet)resultSet).getARRAY(1);

  // Get the VARRAY elements; values.length is the number of values in the VARRAY

  java.math.BigDecimal[] values = (java.math.BigDecimal[])array.getArray();

  }

  注意:乱码问题,依赖于nls_charset12.jar,否则字符串类型的数据是乱码,插入失败,读取出来是null

  请将nls_charset12.jar放于classpath下即可。

相关文章:Oracle初学者必知的100个问题

oracle安装完成后的初始口令? UPDATE AAA SET BNS_SNM=(SELECT BNS_SNM FROM BBB WHERE AAA.DPT_NO=BBB.DPT_NO) W HERE BBB.DPT_NO IS NOT NULL; 23. P4电脑安装方法 将SYMCJIT.DLL改为SYSMCJIT.OLD 24. 何查询SERVER是不是OPS? SELECT * FROM V$OPTION。

 

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

 

Use Oracle's VARRAY Through JDBC
This code snippet demonstrates how to use Oracle's VARRAY through JDBC. The code:
  1. Creates VARRAYs of different lengths.
  2. Contains a table to store data of above array type.
  3. Stores the objects in an array.Inserts them into database table in two different ways (with SQL and ArrayDescriptor).</LI itxtHarvested="0" itxtNodeId="459">

import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.oracore.Util;
import oracle.jdbc.*;
public class VArrayManipulation
{
public static void main (String args[])
throws Exception
{
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
// The sample retrieves an varray of type "STRING_VARRAY",
// materializes the object as an object of type ARRAY.
// A new ARRAY is then inserted into the database.
String url = "<connection url>";
// Connect to the database
Connection conn =
DriverManager.getConnection (url, "<user>" , "<password>");
conn.setAutoCommit (false);
// Create a Statement
Statement stmt = conn.createStatement ();
try
{
stmt.execute ("DROP TABLE sample_varray_table");
stmt.execute ("DROP TYPE string_varray");
}
catch (SQLException e)
{
//Exceptions will be thrown if Table and types doesnt exist . Ignore this
}
stmt.execute ("CREATE TYPE string_varray AS VARRAY(10) OF VARCHAR2(100)");
stmt.execute ("CREATE TABLE sample_varray_table (acol string_varray)");
//Insert using SQL
stmt.execute ("INSERT INTO sample_varray_table VALUES (string_varray('Test1', 'Test2'))");
ResultSet rs = stmt.executeQuery("SELECT acol FROM sample_varray_table");
printResultSet (rs);
//Insert using ArrayDescriptor
// create a new ARRAY object
String arrayElements[] = { "Test3", "Test4" };
ArrayDescriptor desc = ArrayDescriptor.createDescriptor
("STRING_VARRAY", conn);
ARRAY newArray = new ARRAY(desc, conn, arrayElements);
PreparedStatement ps =
conn.prepareStatement ("insert into sample_varray_table values (?)");
((OraclePreparedStatement)ps).setARRAY (1, newArray);
ps.execute ();
rs = stmt.executeQuery("SELECT acol FROM sample_varray_table");
printResultSet (rs);
// Close all the resources
rs.close();
ps.close();
stmt.close();
conn.close();
}
public static void printResultSet (ResultSet rs)
throws SQLException
{
System.out.println("********Fetch Starts....********");
int line = 0;
while (rs.next())
{
line++;
System.out.println("********Row "+line+" : ");
ARRAY array = ((OracleResultSet)rs).getARRAY (1);
System.out.println ("Array is of type "+array.getSQLTypeName());
System.out.println ("Array is of length "+array.length());
// get Array elements
String[] values = (String[]) array.getArray();
for (int i=0; i<values.length; i++)
{
System.out.println("index "+i+" = "+values[i] );
}
}
System.out.println("********Fetch Ends....********");
}
}

http://www.devx.com/tips/Tip/22034

 

 

 

 

 

 

 

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

上一篇: 如何在Oracle中修改Collection类型的变量。 | 下一篇: Javascript获取字符串字节数的方法
 如何在JAVA程序中使用Struct一次传入多条数据给Oracle的存储过程。     
为了减少连接Oracle数据库的数量,需要将多条数据作为变量一次传入Oracle的存储过程中。方法如下:
步骤一:定义对象类型。 
CREATE TYPE department_type AS OBJECT (
DNO NUMBER (10),
NAME VARCHAR2 (50),
LOCATION VARCHAR2 (50)
);
步骤二:定义一个对象类型的数组对象。
CREATE TYPE dept_array AS TABLE OF department_type;
步骤三:定义存储过程来插入数据。
CREATE OR REPLACE PACKAGE objecttype AS
  PROCEDURE insert_object (d dept_array);
END objecttype;
CREATE OR REPLACE PACKAGE BODY objecttype
AS
PROCEDURE insert_object (d dept_array)
AS
BEGIN
FOR i IN d.FIRST..d.LAST
LOOP
INSERT INTO department_teststruct
VALUES (d(i).dno,d(i).name,d(i).location);
END LOOP;
END insert_object; 
END objecttype;

步骤四(可选步骤,即可以不做):定义一个Java class来映射对象中类型。
步骤五:定义Java方法来调用存储过程。 

import java.sql.Connection; 
import java.sql.DriverManager;
import oracle.jdbc.OracleCallableStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

public class TestStruct ...{
    public static void main(String[] args)
    ...{
            sendStruct();
    }
    public static void sendStruct() 
    ...{
        Connection dbConn = null;
        try...{    
            Object[] so1 = ...{"10","Accounts","LHR"}; 
            Object[] so2 = ...{"20","HR","ISB"}; 
            OracleCallableStatement callStatement = null; 
            Class.forName("oracle.jdbc.driver.OracleDriver");
            dbConn = DriverManager.getConnection("jdbc:oracle:thin:@ServerName:Port:ORa", "UserName", "Password");
            StructDescriptor st = new StructDescriptor("DEPARTMENT_TYPE",dbConn);
            STRUCT s1 = new STRUCT(st,dbConn,so1);
            STRUCT s2 = new STRUCT(st,dbConn,so2);
            STRUCT[] deptArray = ...{s1,s2};
            ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("DEPT_ARRAY", dbConn);
            ARRAY deptArrayObject = new ARRAY(arrayDept, dbConn, deptArray); 
            callStatement = (OracleCallableStatement)dbConn.prepareCall("{call insert_object(?)}");
            ((OracleCallableStatement)callStatement).setArray(1, deptArrayObject);
            callStatement.executeUpdate(); 
            dbConn.commit();
            callStatement.close(); 
        } 
        catch(Exception e)...{ 
            System.out.println(e.toString());
        }
    }
}
http://zhidao.baidu.com/question/49553096.html

 

通过Java操控Oracle对象(2)

下面接着讲有关Oracle Object的更新首先需要确定的是:标准Java Struct类并不能更新和修改Oracle Object, 具体原因, 我在稍后会解释.幸运的是:Oracle提供了STR...
  • DragonBill
  • DragonBill
  • 2007年07月24日 08:42
  • 1608

Golang初级系列教程-结构体匿名字段-Anonymous fields in structs

Golang初级系列教程-结构体匿名字段-Anonymous fields in structsGo 结构体中支持匿名字段。1.外围结构体可以直接访问匿名结构体的字段 2.匿名字段通过其类型名也可以访...
  • DowntownGuy
  • DowntownGuy
  • 2016年01月14日 15:19
  • 1290

Golang Go语言结构体中匿名字段暴露方法的优先级

Golang Go语言结构体中匿名字段暴露方法的优先级 Go语言的结构体中可以包含匿名的字段,比如: 1 2 3 4 5 6 7 struct {     T1        ...
  • typ2004
  • typ2004
  • 2014年11月29日 23:03
  • 3413

Struct库的使用

Struct库的使用
  • yhs_cy
  • yhs_cy
  • 2017年05月07日 13:36
  • 284

golang通过反射使用json字符串调用struct的指定方法及返回json结果

golang通过反射使用json字符串调用struct的指定
  • changjixiong
  • changjixiong
  • 2016年11月02日 19:55
  • 1976

c++将struct中的内容写入txt文件的方法(含嵌套struct情况)

C++语言继承了C语言的struct,并且加以扩充。在C语言中struct只能定义数据成员,而不能定义成员函数。而在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数...
  • piaoxuezhong
  • piaoxuezhong
  • 2017年03月14日 13:01
  • 1043

面向对象概念:字段、属性和方法

1、字段和属性的概念和区别       字段:一个成员,它表示与对象或类关联的变量      在面向对象里,属性表示的是一个对象的状态,既然是状态那么肯定是用来获取或设置的。      ...
  • acs713
  • acs713
  • 2013年06月08日 15:20
  • 5696

C#详解struct和class的区别

可以从数据类型、访问权限(封装)、继承、构造函数、实例化方面做比较 3.struct 默认的访问权限是public,而class默认的访问权限是private. 简单来说,st...
  • qiaoquan3
  • qiaoquan3
  • 2016年04月24日 16:28
  • 5868

struct匿名字段和interface,断言

struct interface
  • qu_tao
  • qu_tao
  • 2016年09月06日 22:39
  • 375

7 Python struct模块-深入学习

深入学习Python中struct模块,大小端,pack()、unpack()函数
  • lis_12
  • lis_12
  • 2016年10月10日 15:11
  • 3413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:racle的STRUCT和VARRAY的读写方法
举报原因:
原因补充:

(最多只允许输入30个字)