如何在oracle 存储过程中定义数组?
数组的元素为一个表的字段值,如何操作?

解决方案 »

  1.   

    TYPE type_name IS TABLE OF TABLE%ROWTYPE INDEX BY BINARY_INTEGER; 
      

  2.   

    TYPE type_name IS TABLE OF TABLE%ROWTYPE INDEX BY BINARY_INTEGER; 
    这种是索引表阿
      

  3.   

    PL/SQL中没有数组的概念,他的集合数据类型和数组是相似的。在7.3以前的版本中只有一种集合,成为PL/SQL表,在这之后又有两种集合数据类型:嵌套表和varray。
    其中varray集合中的元素是有数量限制的,二index_by表和嵌套表是没有这个限制的。
    index-by表是稀疏的,也就是说下标可以不连续,二varray类型的集合则是紧密的,他的下标没有间隔。index_by表不能存储在数据库中,但是嵌套表和varray可以被存储在数据库中。、
    集合在使用时必须先使用type进行定义方可使用
    index_by表
    type type_name is table of element_type [NOT NULL] index by binary_integer
    嵌套表
    type type_name is table of element_type [NOT NULL]
    varray
    type type_name is [varray|varying array](max_size) of element_type[NOT NULL]
      

  4.   

    给你个例子为了减少连接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());
            }
        }
    }jdbc:oracle:thin:            --Oracle数据库驱动标识
    ServerName:                 --Oracle数据库所有机器名或IP地址
    1521:                           --数据库所使用的端口号
    ORa                             --Oracle服务名    注意事项:
    1. 首先一个操作是手动连接Oracle建立对象,接下来的操作是通过JAVA程序建立数据库连接来使用对象。如果两个操作使用同一个用户就没有问题,如果是不同的用户那么要确保第二个操作(即通过Java程序)的用户有权限来操作第一个用户建立的对象。第一个用户为它添加权限的方法是:在每个对象中大家可以找到权限一项,找到对应用户添加执行权限即可。而在程序中就需要做一些修改。存储过程同理。
       StructDescriptor st = new StructDescriptor("第一个UserName.DEPARTMENT_TYPE",dbConn);
          ArrayDescriptor arrayDept = ArrayDescriptor.createDescriptor("第一个UserName.DEPT_ARRAY", dbConn);
          callStatement = (OracleCallableStatement)dbConn.prepareCall("{call 第一个UserName.insert_object(?)}");结果是Java中虽然只是一次执行连接数据库,但是却一次插入两条数据。希望能够给寻找类似解决方案的兄弟姐妹提供一点帮助。有什么建议或者意见尽管留言,谢谢。参考资料:
    1. 大家可以在下面的链接中找到javadoc文件来进行下载,这是一个非常有用的说明文档,这次我主要用到了DriverManager.getConnection的定义方法。
    http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc101020.html
    CREATE DATABASE LINK command | 提高ORACLE数据库系统import性能    16:56
        浏览 (1227)
        评论 (1)
        分类: Java General
        相关推荐评论
    1 楼 sfgeeq 2009-01-15   引用
    我运行的时候发现NUMBER型 的可以插入,VARCHAR2类型的就不行!
    我改了一下!
    CREATE TYPE department_type AS OBJECT (
    DNO NUMBER (10),
    NAME VARCHAR2 (50),
    LOCATION VARCHAR2 (50)
    );
    改成:
    CREATE TYPE department_type AS OBJECT (
    DNO NUMBER (10),
    NAME nVARCHAR2 (50),
    LOCATION nVARCHAR2 (50)
    );
    然后就可以了!
    不过我不知道为什么这么改就没问题!