บทความ

กำลังแสดงโพสต์ที่มีป้ายกำกับ PLSQL

Java Call PLSQL With Input data type Table Array of Records

 ตัวอย่าง Code Java กรณีที่เราต้องการ ส่ง Parameter เข้า Oracle PLSQL แบบ รับ Input เป็น Array of Records   ข้อดีคือทำให้เราสามารถ Call PLSQL ผ่าน JDBC ครั้งเดียวแล้วส่ง List of Data เข้าไป ประมวลผลใน PLSQL ได้เลย (ปรกติก็วนเรียก ทีละ record เอาก็ได้อ่ะนะ ^^) สิ่งสำคัญที่ต้องทำเพิ่มเติมมีดังต่อไปนี้ 1. การ Map Data Type โดยจะต้องทำการ Mapping ทั้ง Type ที่เป็น Record และ Type Array ตามตัวอย่างด้านล่าง         StructDescriptor sd = StructDescriptor.createDescriptor("MY_RECORD", conn);         ArrayDescriptor ad = ArrayDescriptor.createDescriptor("MY_ARRAY", conn); conn หมายถึงตัวแปร Connection ที่ connect database ไว้แล้วนะครับ ซึ่ง การ Run สองคำสั่งนี้ ทางฝั่ง Database Oracle จะต้องมีการ Create TYPE ตามที่เราส่ง parameter ไว้แล้วนะครับ ถ้าหากไม่มีจะ เกิด Exception ขึ้นทันที   ตัวอย่างการ Create type ที่ Oracle PLSQL ก็ประมาณนี้  ตัวอย่างการ Create Type ที่เป็น Record (Object) CREATE OR REPLACE TYP...

Oracle create index field datetime ด้วย Function-based indexes

บ่อยครั้งที่เรามีข้อมูลเก็บใน field ที่เป็น data type Datetime และมีความจำเป็นต้อง search ด้วยเงื่อนไขของ field นี้ โดยปรกติ เราจะสร้าง index บน Oracle ใน field ที่เราใช้เป็นเงื่อนไข เช่น create index f_datetime_indx on my_table(f_datetime); หากเราทำการค้นหา เช่น select * from my_table where f_datetime = sysdate; คำสั่งแบบนี้ Oracle จะใช้ index ในการทำงาน แต่ถ้าหากเราต้องการ Query ข้อมูลทั้งวันเรามักจะใช้คำสั่ง trunc(d) เช่น select * from my_table where trunc(f_datetime) = trunc(sysdate) ปัญหาจะเกิดขึ้นทันทีเพราะ Oracle จะไม่ใช้ index และจะกลายเป็น Full table scan แนวทางแก้คือให้ใช้   Function-based indexes ตามตัวอย่าง create index f_datetime_indx on my_table(trunc(f_datetime)); เพียงเท่านี้เราสามารถ Query field date โดยใช้ function trunc ใน where condition ได้เลย และ oracle จะใช้ index ในการทำงาน

Oracle PLSQL Replace String With REGEXP_REPLACE

บทความเกี่ยวกับ : Oracle PLSQL Replace String With REGEXP_REPLACE ตัวอย่างการใช้คำสั่ง REGEXP_REPLACE REGEXP_REPLACE('String ตั้งต้น', 'เงื่อนๆไข REGEXP','String ที่จะ Replace'); ตัวอย่างการใช้งาน     SELECT REGEXP_REPLACE ('XXTEST1X23', '^(XX*)', 'YY') FROM dual; --ผลที่ได้คือ : YYTEST1X23 SELECT REGEXP_REPLACE ('XXTEST1XX23', '^(X)', 'YY') FROM dual; --ผลที่ได้คือ : YYXTEST1XX23 SELECT REGEXP_REPLACE ('XXTEST1XX23', '^(X*)', 'YY') FROM dual; --ผลที่ได้คือ : YYTEST1XX23 SELECT REGEXP_REPLACE ('XXTEST1XX23', 'XX', 'YY') FROM dual;--ผลที่ได้คือ : YYTEST1YY23 SELECT REGEXP_REPLACE ('XXTEST1XX23', 'X', 'YY') FROM dual; FROM dual;--ผลที่ได้คือ : YYYYTEST1YYYY23 SELECT REGEXP_REPLACE ('XXTEST1XX23', 'X+', 'YY') FROM dual;--ผลที่ได้คือ : YYTEST1YY23 SELECT REGEXP_REPLACE ('XXTEST1XX23', 'X+|E', ...

การเช็ค IF ELSE ใน PLSQL เรื่องง่ายๆ แต่งมตั้งนาน

บทความเกี่ยวกับ : การเช็ค IF ELSE ใน PLSQL เรื่องง่ายๆ แต่งมตั้งนาน วันนี้ไม่มีไรมาก แค่อยากจะมาบ่น !!!!   แบบว่า เขียน PLSQL แล้ว Compile ไม่ผ่านอ่ะ  แค่เช็คเงื่อนไขง่ายๆ งมอยู่เกือบครึ่งวัน สลัดจริงๆๆๆ ปรกติเขียน Java หรือ ภาษาหลายๆ ตัวโครงสร้างมันก็เรียบๆ ง่ายๆ ประมาณนี้  IF (CONDITION1) THEN  -- ทำไรก็ทำไป  ELSE IF(CONDITION2) THEN  -- ทำไรก็ทำไป  ELSE IF(CONDITION3) THEN  -- ทำไรก็ทำไป  ELSE  -- ทำไรก็ทำไป   อะไรทำนองนี้ชิมิ วันนี้เราจัด PLSQL ก็ประมาณว่าไม่ได้เขียนมานาน ปล.นั่งแก้ Code ชาวบ้านเค้าด้วยแหละ สลัดดดดด !! (ความแค้นส่วนตัว)  มันก็ไม่น่ามีไรมาก ชิมิ ตาม concept เดิม IF (CONDITION1) THEN  -- ทำไรก็ทำไป  ELSE IF(CONDITION2) THEN  -- ทำไรก็ทำไป ELSE IF(CONDITION3)  THEN  -- ทำไรก็ทำไป  ELSE  -- ทำไรก็ทำไป  END IF; -- คือมันไม่มีปีกกงปีกกา หรือวงเล็บไรครอบอ่ะนะ อันนี้ก็เข้าใจ  ปล ใช้ PL/SQL Developer เป็น tool ในการเขียน ก...

PLSQL Select into กับ Dynamic SQL โดยใช้ EXECUTE IMMEDIATE

บทความเกี่ยวกับ : PLSQL Select into กับ Dynamic SQL โดยใช้ EXECUTE IMMEDIATE ปรกติเวลาเราจะ Select ค่าแบบ Single Record แล้วใช้ คำสั่ง into เพื่อเก็บค่าไว้ในตัวแปร เราจะใช้คำสั่งนี้ select std_name into v_std_name from student where std_id='1001' แบบนี้เราก็จะได้ค่าของ std_name ของ รหัส '1001'  มาเก็บในตัวแปร v_std_name แบบง่ายๆ กันเลยทีเดียว แต่ถ้าหากโจทย์มีอยู่ว่า เราจำเป็นต้องใช้แบบ Dynamic SQL คือ เก็บ Statement ไว้ใน ตัวแปร แล้วค่อยนำมา Execute อีกที แล้วแบบนี้จะใส่ into ยังไงดีล่ะ ? วิธีการคือให้ใช้  EXECUTE IMMEDIATE   แล้วต่อด้วย into ตามหลัง ตัวอย่างการใช้งาน v_sql:='select std_name from student where std_id=''1001'''; EXECUTE IMMEDIATE v_sql INTO v_std_name; ประมาณนี้ครับ

Oracle PRAGMA AUTONOMOUS_TRANSACTION เขียน PL ให้เป็นอิสระจาก Main Transaction

บทความเกี่ยวกับ : Oracle PRAGMA AUTONOMOUS_TRANSACTION เขียน PL ให้เป็นอิสระจาก Main Transaction วันนี้มีปัญหาเรื่อง Store procedure ที่เขียนไว้ commit ไม่ได้ทั้งที่นานทีปีหนไม่เคยเป็น อยู่ดีๆ เจอ Error ตัวนี้ : ORA-02089: COMMIT is not allowed in a subordinate session เท่าที่ลองหาข้อมูลดูน่าจะเกิดจาก App ที่ Call (ตอนนี้เป็น Spring +Hibernate) มี Transaction Main ครอบอยู่ ประมาณนี้  Begin    - Call PL ที่มี Being commit อยู่ข้างใน     -Do some thing     -Do some thing     -Do some thing Commit ทำให้เกิด Error เพราะ PL พยายามจะไป Commit ซ้อนใน Main Transaction อีกที เคสนี้บังเิอิญว่างานที่ผมทำก็ไม่ได้ต้องการให้ Logic ใน PL ไปรวมอยู่ใน Transaction นั้นๆ อยู่แล้ว ทางแก้แบบง่ายๆ ที่สุดก็คือ เอา บรรทัดที่ Call PL ออกมาไว้นอก Transaction Block ซะตามนี้  - Call PL ที่มี Being commit อยู่ข้างใน  Begin       -Do some thing     -Do some thing   ...

PL SQL Array การประกาศตัวแปร Array และวิธีการใช้งานใน PLSQL

บทความเกี่ยวกับ : PL SQL Array การประกาศตัวแปร Array และวิธีการใช้งานใน PLSQL วันนี้มีตัวอย่างการใช้ งาน Array ใน PLSQL มาฝากครับ การประกาศและรียกใช้งาน ก็จะคล้ายๆ ภาษาโปรแกรมมิ่ง ทั่วไป เริ่มจากการ กำหนด Data Type TYPE t_array IS VARRAY(10) OF VARCHAR2(20); กำหนด datatype  Array ของ varchar2(20)  จำนวน  10 ช่อง อันนี้ก็เหมือนกับ Array ของที่อื่นๆ ที่ต้องกำหนดจำนวนช่องไว้ให้ชัดเจนแต่แรก T_T ต่อมาก็ำกหนดตัวแปรง่ายๆ v_array := t_array ('1','2','3','4','5'); เวลาเรียกใช้ ก็ ง่ายๆ แบบนี้ครับ v_array(1)   หมายถึง array ช่องที่ 1 มาดูตัวอย่างการใช้งานแบบเต็มๆ กันเลยครับ DECLARE   TYPE t_array IS VARRAY(10) OF VARCHAR2(20);   v_array := t_array ('1','2','3','4','5'); BEGIN    for i in 1 .. v_array.count loop       DBMS_OUTPUT.PUT_LINE('array val is '||v_array(i));    end loop; END;

PL SQL Fetch Cursor วิธีวน Loop ข้อมูลออกจาก Cursor ใน PL SQL

บทความเกี่ยวกับ : PL SQL Fetch Cursor วิธีวน Loop ข้อมูลออกจาก Cursor ใน PL SQL วันนี้จะนำเสนอ การ Query ข้อมูลใน SQL Script ของ Oracle แล้วแล้วทำการ Fetch data ออกมา ด้วยการวน Loop  ตามตัวอย่างเลยครับ DECLARE TYPE cur is REF CURSOR; myCursor cur; out_rec my_tbl%rowtype; BEGIN     open myCursor for select * from my_tbl;     LOOP FETCH myCursor into out_rec;     EXIT WHEN myCursor%NOTFOUND;       DBMS_OUTPUT.PUT_LINE('example data '||out_rec.my_field);     END LOOP;     CLOSE myCursor; EXCEPTION   WHEN OTHERS THEN   DBMS_OUTPUT.PUT_LINE('ERROR >>  '|| SQLERRM); END; ตัวอย่างการ Query แล้ววน Loop แบบเรียบง่ายครับ ลองเอาไปใช้กันดูครับ

Java Call PLSQL Oracle Function และ Store procedure

บทความเกี่ยวกับ : Java Call PLSQL Oracle Function และ Store procedure ตัวอย่างการเขียนโปรแกรมด้วยภาษา Java เพื่อเรียกใช้งาน PLSQL นั้นแตกต่างจากการเขียนเพื่อ Execute SQL statement ธรรมดาอยูนิดหน่อยตามตัวอย่างครับ CallableStatement call=null; ResultSet rs=null; try {                                    call = con.prepareCall("{call TEST_PACK.TEST_PROC(?,?,?) }");             call.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);             call.setString(2,"10001");             call.setString(3,"TEST");                        call.execute();           ...

Oracle PLSQL Procedure ต่างกับ Function ยังไง

บทความเกี่ยวกับ : Oracle PLSQL Procedure ต่างกับ Function ยังไง เพื่อนๆ หลายๆคนคงจะเคยเขียน Program บน Oracle ด้วย PLSQL กันมาบ้าง PLSQL ต่างจาก SQL commmand ตรงที่สามารถใน่ Logic ต่างๆเข้าไปได้มากกว่าไม่ว่าจะเป็น การเช็คเงื่อนไข การ วน Loop เป็นต้น แต่หลายคนอาจสงสัยว่า Procedure ต่างจาก Function ยังไง ผมเองตอนหัดเขียนใหม่ๆ ก็ใช้แต่ Function เพราะคุ้นเคยกับการเขียน Java ที่เป็น method มี input parameter และก็มี return value แต่พอเริ่มเขียนเยอะขึ้นจึงได้เปลี่ยนมาใช้ Procedure แทน ผมจะบอกข้อแตกต่างที่เห็นได้ชัดเจนที่สุดและเป็นประโชยน์ที่สุดให้ฟังเพียงข้อเดียวนะครับคือ   ** Parameter ของ procedure มีได้ทั้ง In และ Out นั่นหมายความว่าคุณสามารถส่งค่าเข้า procedure ได้หลายค่าและก็ return ค่ากลับออกมาได้หลายค่าเช่นกัน สุดยอดดด แต่ ในส่วนของ function นั้นสามารถรับ parameter ได้หลายค่าก็จริงแต่ return ค่ากลับออกมาได้เพียงค่าเดียวเหมือนที่เราคุ้นเคยกัน