Oracle存儲過程入參傳入List集合的小例子


第一步:創建一個對象類型

 create or replace type STUDENT as object(
    id        number(4),
    name    varchar2(50),
    age        number(3)
 );
/

 

第二步:創建一個數組類型 (任意選擇下面的一句執行)

-- 方式1:用table來盛放對象
create or replace type STU_LIST as table of STUDENT;
/

-- 方式2:用數組來盛放對象,同時可指定數組的大小[用as varray(100)也是可以滴]
create or replace type STU_LIST as array(100) of STUDENT;
/

 

第三步:創建一個過程引用集合類型的參數

create or replace procedure test_in_list(
-- 參數區域
    studentlist in STU_LIST,
    message out varchar2
)
is
-- 變量區域
begin
-- 執行區域
    for i in 1 .. studentlist.count loop
        message:=message||'{id:'||studentlist(i).id||', name:'||studentlist(i).name||', age'||studentlist(i).age||'},';
    end loop;
end test_in_list;
/

 

第四步:java調用存儲過程

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;

import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

public class TestProInList {

    // 測試main
    public static void main(String[] args) {
        new TestProInList().testProInList();
    }

    // 調用存儲過程並返回執行結果
    public void testProInList() {
        // 定義需要的變量
        Connection ct = null;
        CallableStatement cs = null;
        ResultSet rs = null;

        try {
            // 加載驅動
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // 得到連接
            ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1", "sccot", "tiger");

            // 創建CallableStatement接口
            cs = ct.prepareCall("{call TEST_IN_LIST(?,?)}");

            // 給in?賦值
            ArrayList<Student> list = new ArrayList<Student>() {
                {
                    this.add(new Student(1, "ZhangSan", 23));
                    this.add(new Student(2, "LiSi", 22));
                    this.add(new Student(3, "WangWu", 21));
                }
            };
            ARRAY array = getArray(ct, "STUDENT", "STU_LIST", list);// 該函數調用的第二三個參數就是上面自定義的兩個類型,在此必須大寫
            // 設置入參
            cs.setArray(1, array);
            // 注冊出參
            cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);

            // 執行
            cs.execute();

            // 獲取返回結果
            String message = cs.getString(2);
            System.out.println(message);
            // 打印結果:
            // {id:1, name:ZhangSan, age23},{id:2, name:LiSi, age22},{id:3,
            // name:WangWu, age21},

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉資源
            try {
                if (cs != null) {
                    cs.close();
                }
                if (rs != null) {
                    rs.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            cs = null;
            rs = null;
            ct = null;
        }
    }

    private ARRAY getArray(Connection con, String OraObjType, String OraArrType, ArrayList<Student> stuList)
            throws Exception {
        ARRAY list = null;
        if (stuList != null && stuList.size() > 0) {
            // Oracle識別的集合對象,匹配java對象集合
            STRUCT[] structs = new STRUCT[stuList.size()];

            // Oracle識別的對象模板,匹配單個java對象
            StructDescriptor structdesc = new StructDescriptor(OraObjType, con);

            // 遍歷stuList,將每個Student對象轉換為Oracle可識別的模板對象
            for (int i = 0; i < stuList.size(); i++) {
                // java對象
                Student student = stuList.get(i);

                // 數組大小應和你定義的數據庫對象(STUDENT)的屬性的個數
                Object[] oneRow = new Object[3];
                oneRow[0] = student.getId(); // 將Student對象的每個屬性按順序設置到oneRow數組中
                oneRow[1] = student.getName();
                oneRow[2] = student.getAge();
                structs[i] = new STRUCT(structdesc, con, oneRow);
            }

            // 匹配list
            ArrayDescriptor desc = ArrayDescriptor.createDescriptor(OraArrType, con);
            list = new ARRAY(desc, con, structs);
        }
        return list;
    }
}

class Student {
    private int id;
    private String name;
    private int age;

    // 構造函數
    public Student(int id, String name, int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }

    // getters/setters(略)

}

 

集合元素為基本數據類型時的小例子

sql部分:

-- 創建數組對象
create or replace type tables_array as varray(100) of varchar2(32);
/

-- 測試用存儲過程
create or replace procedure test_in_list(
--參數區域
    objlist in tables_array,
    message out varchar2
) is
--變量區域
begin
--執行區域
  for i in objlist.first .. objlist.last loop
    message:=message||objlist(i)||',';
  end loop;
  commit;
end test_in_list;
/

java部分:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class TestProInList {

    // 調用測試用存儲過程
    public static void main(String[] args) {
        // 定義需要的變量
        Connection ct = null;
        CallableStatement cs = null;
        ResultSet rs = null;

        try {
            // 加載驅動
            Class.forName("oracle.jdbc.driver.OracleDriver");

            // 得到連接
            ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1", "sccot", "tiger");

            // 創建CallableStatement接口
            cs = ct.prepareCall("{call TEST_IN_LIST(?,?)}");

            // 給in?賦值
            ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TABLES_ARRAY", ct);
            List<String> list = new ArrayList<String>() {
                {
                    this.add("abc");
                    this.add("edf");
                    this.add("ghi");
                }
            };
            ARRAY array = new ARRAY(descriptor, ct, list.toArray());
            // 設置入參
            cs.setArray(1, array);
            // 注冊出參
            cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);

            // 執行
            cs.execute();

            // 獲取返回結果
            String message = cs.getString(2);
            System.out.println(message); //打印結果: abc,edf,ghi,

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 關閉資源
            try {
                if (cs != null) {
                    cs.close();
                }
                if (rs != null) {
                    rs.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            cs = null;
            rs = null;
            ct = null;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM