有別於PostgreSQL可以直接把欄位定義為陣列型態,Oracle是透過自訂型態的方式達成目標,飯粒如下:

create or replace Type varray_phone as varray(3) of varchar2(20)

  上述是定義一個名為varray_phone的Type,是維度為三個varchar2(20)的資料型態。所以varray是宣告陣列維度,of後接的不止Oracle的資料型態度,也可以接更複雜的Oracle Object型態,複雜的部份就不討論。而其Create、Insert的用法很簡單,如下:

create table employee (id number(10) primary key, name varchar2(10), phone varray_phone)
Insert into employee values (1, 'Jemmy', varray_phone('0911-222333', '0922-33344'))

  這篇文章http://www.devx.com/tips/Tip/22034描述如何用JDBC存取Array型態,就不贅述,此處列出如何用Spring的JDBC Template存取Array型態飯粒。

import javax.sql.DataSource;

import oracle.sql.ARRAY;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.systex.rdf4.util.AnnotationConfigContextLoader;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class,
        value = "com.foo.bar.DSConfig")
public class TestVArray {
    private static Logger logger = LoggerFactory.getLogger(TestVArray.class);

    private SimpleJdbcTemplate simpleJdbcTemplate;

    @Autowired
    public void init(DataSource datasource) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(datasource);
    }

    @Test
    public void testVArray() {
        String sql = "insert into employee values (?, ?, varray_phone(?, ?, ?))";
        this.simpleJdbcTemplate.update(sql, 2, "Tom", "12345", "67890", "09876");
        sql = "select * from employee";
        List<Map<String, Object>> rsList = this.simpleJdbcTemplate.queryForList(sql);
        for (int i=0, n=rsList.size(); i<n; i++) {
            System.out.println("====== Line #" + i + " ======");
            Map<String, Object> map = rsList.get(i);
            System.out.println(map.get("NAME"));
            ARRAY array = (ARRAY) map.get("PHONE");
            try {
                String[] values = (String[]) array.getArray();
                if (values != null) {
                    for (String phone : values) {
                        System.out.println(phone + ", ");
                    }
                } else {
                    System.out.print("phone is null");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jemmy 的頭像
    Jemmy

    Jemmy Walker

    Jemmy 發表在 痞客邦 留言(0) 人氣()