Archive for February, 2010

Java Primitive data type default value

จำไม่ค่อยจะได้สักที Note ไว้เลยเวลาถามหาจะได้จำได้ให้ขึ้นใจ Primitive data type ในภาษา Java มีอยู่ 8 ชนิดแสดงดังตาราง

Data Type Default Value
byte 0
short 0
int 0
long 0L (0l)
float 0.0f (0.0F)
double 0.0d (0.0D)
char ‘\u0000’
String และ Object) null
boolean false

ลอกมาจาก
Primitive Data Types

ข้อแตกต่างระหว่าง stored procedures และ functions ใน PL/SQL

ข้อแตกต่างระหว่าง stored procedures และ functions ใน PL/SQL มีดังนี้
1. function ต้องมีการคืนค่า แต่ procedure ไม่จำเป็นต้องคืนค่าก็ได้
2. ไม่สามารถใช้คำสั่ง “select functionXX() from dual” ในกรณีที่ ใน function นั้นมีการใช้คำสั่ง DML (คำสั่ง insert,update, delete)
3. แต่ถ้าใน function มีการใช้ “autonomous transaction” ก็สามารถใช้ได้
4. ไม่สามารถเรียกใช้ procedure ผ่าน คำสั่ง SQL Query เช่น “select procedureXX() from dual” ได้

Using dynamic SQL in PL/SQL

เวลาที่ต้องการใช้คำสั่ง SQL ใน PL/SQL แบบ Dynamic นั้นสามารถทำได้โดยใช้คำสั่ง

EXECUTE IMMEDIATE

ดังเช่นตัวอย่างนี้

CREATE OR REPLACE PROCEDURE DELETE_DATA IS
    V_DEL   NUMBER := 0;
    V_I     NUMBER := 0;
    V_SQL   VARCHAR(1000);
    
BEGIN
    --Create sql statement
    V_SQL := 'DELETE FROM TMP WHERE ID = :1';
    
    --Loop for delete data
    FOR V_I IN 1..5 LOOP
        EXECUTE IMMEDIATE V_SQL USING V_I;
        V_DEL := V_DEL+SQL%ROWCOUNT;
    END LOOP;
    
    DBMS_OUTPUT.PUT_LINE('Delete1 : '||V_DEL||' Record(s)');    
    
    ROLLBACK;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        ROLLBACK;
        NULL;
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END DELETE_DATA;
/

ประเภทของ Cursor ใน PL/SQL

Cursor เป็นโครงสร้างข้อมูลของ PL/SQL หรือชนิดข้อมูล pointer ที่อ้างอิงถึง work area เมื่อมีการรันคำสั่ง SQL ในฐานข้อมูล Oracle จะมีการสร้างพื้นที่ในหน่วยความจำภายในฐานข้อมูลเพื่อใช้ในการทำงานกับคำสั่ง SQL Cursor แบ่่งออกเป็นสองประเภทดังนี้
Implicit cursors :
คือ Cursor ที่ถูกสร้างโดยอัตโนมัติ เมื่อมีการเรียกใช้คำสั่ง DML เช่น INSERT, UPDATE, และ DELETE และ SELECT ที่ส่งคืนค่าเพียงรายการเดียว
Explicit cursors:
คือ Cursor ที่ผู้ใช้งานสร้างขึ้นเอง ซึ่งต้องเขียนคำสั่งต่างๆ เพื่อมาจัดการ Cursor เอง

คำสั่ง หรือ สถานะ ต่างๆที่ Oracle เตรียมไว้ให้สำหรับ Implicit cursors
%FOUND คืนค่าเป็น TRUE เมื่อคำสั่ง DML เช่น INSERT, UPDATE, และ DELETE และ SELECT คืนค่ามาอย่างน้อย หนึ่ง รายการ รูปแบบการใช้งานเช่น

SQL%FOUND

%NOTFOUND การทำงานตรงข้ามกับ %FOUND รูปแบบการใช้งานเช่น

SQL%NOTFOUND

%ROWCOUNT แสดงจำนวนรายการที่เกิดจากคำสั่ง DML รูปแบบการใช้งานเช่น

SQL%ROWCOUNT

ตัวอย่างการใช้งาน

CREATE OR REPLACE PROCEDURE DELETE_DATA IS
BEGIN
    DELETE FROM TMP WHERE ID = '1';    
    DBMS_OUTPUT.PUT_LINE('Delete1 : '||SQL%ROWCOUNT||' Row(s)');
    
    DELETE FROM TMP;    
    DBMS_OUTPUT.PUT_LINE('Delete2 : '||SQL%ROWCOUNT||' Row(s)');
    
    ROLLBACK;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
       NULL;
    WHEN OTHERS THEN
       RAISE;
END DELETE_DATA;

ข้อมูลจาก
What are Cursors?

ประสิทธิภาพ regular expression

จากเรื่อง Count number of charactor in String ก่อนหน้านี้ พอดีมีงานลักษณะเดียวกัน แต่เป็นการอ่านข้อมูลจาก text file ที่มีขนาดประมาณ 1MB และมีข้อมูลตัวอักษรประมาณ 1,017,825 ตัว ผลการทดลองอย่างคร่าวๆได้ผลว่าการเขียน code แบบวน loop ตัดอักษรทีละตัวมาตรวจสอบนั้นทำงานได้ไวกว่าแบบใช้ regular expression ตัวอย่าง code การทดสอบ เผื่อใครจะเห็นว่า
เขียนได้ห่วยเอง มันเลยไม่ได้ประสิทธิภาพ ผลการทดสอบดังนี้
แบบธรรมดา

private static void test1(String data) {
	int found = 0;
	long start = System.currentTimeMillis();
	for (int i = 0; i < data.length(); i++) {
		found += ('M' == data.charAt(i)) ? 1 : 0;
	}
	long end = System.currentTimeMillis();
	System.out.println("Data : " + data.length());
	System.out.println("Found : " + found);
	System.out.println("Start : " + start);
	System.out.println("End : " + end);
	System.out.println("Diff : " + (end - start));
}

ผลการรัน

Data : 1017825
Found : 42880
Start : 1266287262406
End : 1266287262421
Diff : 15

Read more