Archive for March, 2010

Delete SVN folder

เนื่องจากโปรเจคส่วนมากจะใช้ Subversion เป็น control version แต่เวลาส่ง source code ให้กับผู้ว่าจ้างนั้น เค้าบอกให้ลบ folder “.svn” ซึ่งซ่อนอยู่ออกให้หมด แรกๆไปเปิดไล่ลบออกที่ละ folder จนครบ (ถ้าลง TortoiseSVN ก็ใช้การ Export ได้เลยครับ) แต่พอไฟล์เยอะขึ้นมาก็ปวดหัวและเสียเวลาพอสมควรก็เลย เขียน Java มาเพื่อใช้ลบ folder “.svn” ดังนี้

/**
 * File Name : CleanSVNProject.java
 * Created Date : Mar 29, 2010 : 9:01:06 AM
 * Copyright © 2010 www.fun4station.com
 */
package com.fun4station.example;
import java.io.File;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class CleanSVNProject {

	public static void main(String[] args) {
		deleteDir(new File("D:/AppSource/Project"), false);
	}

	public static void deleteDir(File dir, boolean isDelete) {
		if (dir.isDirectory()) {
			String[] childs = dir.list();
			for (int i = 0; i < childs.length; i++) {
				if (".svn".equalsIgnoreCase(childs[i])) {
					deleteDir(new File(dir, childs[i]), true);
				} else {
					if (dir.getPath().indexOf(".svn") != -1) {
						deleteDir(new File(dir, childs[i]), true);
					} else {
						deleteDir(new File(dir, childs[i]), false);
					}
				}
			}
		}

		if (isDelete) {
			System.out.println("Delete : " + dir.getPath() + "\\"+ dir.getName());
			dir.delete();
		}
	}
}

ใครมีวิธีการดีกว่านี้ก็แนะนำหน่อยครับ

Java : Manage CLOB in oracle 10G

เนื่องจากมีข้อมูลในตารางบางส่วนที่จัดเก็บ ข้อมูลชนิด CLOB ซึ่งแต่ไหนแต่ไรการจัดการข้อมูลข้อมูลชนิดนี้ ค่อนข้างยากครับ ทั้งการบันทึกข้อมูล, การ query ข้อมูล แต่สำหรับ Oracle 10G และ Oracle JDBC ตัวใหม่ช่วยแก้ปัญหานี้ให้สามารถทำงานกับ CLOB ได้อย่างง่ายโดยแค่ Set Properties ของ JDBC ด้วยค่าดังนี้

private Connection getConnection() {
	Connection conn = null;
	try {
		String url = "jdbc:oracle:thin:@localhost:1521:XE";
		Properties props = new Properties();
		props.put("user", "TRAM");
		props.put("password", "password");
		props.put("SetBigStringTryClob", "true");
			
		Class.forName("oracle.jdbc.OracleDriver");
		conn = DriverManager.getConnection(url, props);
		
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	} catch (SQLException e) {
		e.printStackTrace();
	}

	return conn;
}

Properties ที่สำหคัญก็คือ บรรทัดนี้

props.put("SetBigStringTryClob", "true");

แค่นี้ก็สามารถจัดการข้อมูล CLOB แบบ String ธรรมดาได้แล้วครับ นั่นก็คือ ตอนบันทึกก็สามารถ Set ค่า String ได้เลย และต้อง Get ออกมาก็แค่ Get String ธรรมดาเหมือน column ที่เป็น VARCHAR ทั่วๆไป
อ้่างอิงจาก
Handling CLOBs – Made easy with Oracle JDBC 10g
Manage CLOB

Java : ลบ directory

ปัญหาอย่างหนึ่งในภาษา Java(หรือเป็นทุกภาษาก็ไม่รู้) ก็คือไม่สามารถลบ directory ที่ต้องการได้ถ้ายังไม่ได้ลบไฟล์ภายในออกให้หมด ดังนั้นถ้าต้องการลบ directory ต้องทำการลบไฟล์ออกให้หมดก่อน ดังนี้

/**
 * File Name : DeleteDir.java
 * Created Date : Mar 29, 2010 : 9:34:33 AM
 */
package com.fun4station.example;
import java.io.File;

/**
 * @Author Supot Saelao 
 * @Version 1.0
 */
public class DeleteDir {

	public static void main(String[] args) {
		deleteDir(new File("/usr/tmp"));
	}

	private static void deleteDir(File dir) {
	    if (dir.isDirectory()) {
	        String[] subDirs = dir.list();
			for (int i = 0; i < subDirs.length; i++) {
				//Call Recursive for delete sub dirs
	           deleteDir(new File(dir, subDirs[i]));
	        }
	    }
	    //Delete main dir
		dir.delete();
	}
}

อ้างอิง & ลอกมาจาก
Deleting a Directory
Recursion

แก้ปัญหา Toad แสดงภาษาไทยไม่ได้

ติดปัญหาเวลาลง Toad For Oracle แล้วไม่สามารถแสดงภาษาไทยได้ วิธีที่ผมใช้แก้ปัญหาก็คือ เข้าไปใน regedit หา key ชื่อว่า

NLS_LANG

แล้วแก้ไขค่า value เป็น

THAI_THAILAND.TH8TISASCII

เป็นอันเรียบร้อย
หมายเหตุ : Key NLS_LANG มีหลายที่ด้วยกันผมไม่แน่ใจว่าต้องแก้ทุกตัวหรือเปล่า ก็เลยแก้ไขทุกตัวไปเลยครับ

Insert XML to Oracle XMLType

มีงานที่ต้องนำข้อมูลที่อยู่ในรูปแบบ XML ลงไปบันทึกในฐานข้อมูล ของ Oracle ข้อมูลที่จะทำการบันทึก็เป็นแค่ XML ที่อยู่ในรูปแบบของ String ธรรมดาแต่ต้องการเอาไปเก็บเป็นชนิดข้อมูล (Data Type) ที่เป็น XML ของ Oracle จากการหาข้อมูลดูก็ได้ตัวอย่าง Code จาก เว็บ Oracle เลยทดลองเขียนเป็น PL/SQL ดังนี้
สร้างตาราง

CREATE TABLE XML_TEM(
  XML_ID    VARCHAR2(30 BYTE) NOT NULL,
  XML_DESC  VARCHAR2(50 BYTE),
  XML_DATA  SYS.XMLTYPE
);

สร้าง Procedure

CREATE OR REPLACE PROCEDURE INSERT_XML IS
    V_XML       VARCHAR(4000);
    V_ERR_CODE  VARCHAR(100);
    V_ERR_DESC  VARCHAR(1000);

BEGIN
    V_XML := V_XML||'<?xml version="1.0" encoding="UTF-8"?>';
    V_XML := V_XML||'<PROCESS>';
    V_XML := V_XML||'<STATUS>OK</STATUS>';
    V_XML := V_XML||'<DESC>Process transaction success.</DESC>';
    V_XML := V_XML||'</PROCESS>';
   
    INSERT INTO XML_TEM (XML_ID, XML_DESC, XML_DATA) 
    VALUES ('101','Command state',XMLTYPE(V_XML));
   
EXCEPTION
    WHEN OTHERS THEN
        V_ERR_CODE := SQLCODE;
        V_ERR_DESC := SQLERRM;        
END INSERT_XML;
/

ซึ่งไม่มีปัญหาอะไร และ ทดสอบโดยใช้วิธีเดียวกันนี้กับ Code Java ก็ใช้งานได้ดี ดังนี้

private static void insertXML() throws SQLException{
	Connection conn = null;
	PreparedStatement pStmt = null;
	StringBuffer sql = new StringBuffer();
	String xmlData = "<data><no>100</no><name>Name is</name></data>";
	try{
		conn = getConnection();							
		sql.append("INSERT INTO XML_TEM (XML_ID, XML_DESC, XML_DATA)");
		sql.append(" VALUES (?,?,XMLTYPE(?))");
				
		pStmt = conn.prepareStatement(sql.toString());
		pStmt.setString(1, "101");
		pStmt.setString(2, "XML Information support data");
		pStmt.setString(3, xmlData);
		
		pStmt.executeUpdate();
		conn.commit();		
	}catch (SQLException e){
		conn.rollback();
		e.printStackTrace();
	}finally{
		if(pStmt != null) pStmt.close();
		if(conn != null) conn.close();
	}
}

หมายเหตุ : สามารถใช้ได้กับ XML ขนาดสูงสุดที่ 64K เท่านั้น หากมีขนาดมากว่า 64k จะไม่สามารถใช้ได้
อ้างอิง
Loading a large XML Document into the Database