ไม่ได้เข้ามาเขียน blog นานจนแทบจะลืมไปแล้ว วันนี้หัวข้อที่เขียนไม่ได้เป็นสาระอะไรมากมาย แต่ขัดอกขัดใจนิดหน่อย เมื่อเว็บที่เราติดตามประจำอ้างถึง sysdate ว่าเป็น pseudocolumn ที่จริงมันก็ไม่ได้สำคัญอะไรว่า sysdate จะเป็น pseudocolumn หรือเปล่า แค่ให้รู้ว่ามันคืนค่าเป็นวันที่ปัจจุบันก็น่าจะพอแล้ว แต่ว่าพูดถึงมันซะหน่อยก็ดี เพราะตอนผมเริ่มเรียนรู้ oracle ใหม่ ๆ ก็งงกับศัพท์ตัวนี้เหมือนกัน (ไม่รู้ว่า database ยี่ห้ออื่นใช้แบบเดียวกันหรือเปล่านะ)
หากอ้างอิงจาก oracle sql reference แล้ว sysdate ถือเป็น function ครับ ไม่ใช่ pseudocolumn โดย oracle ให้คำจำกัดความระบุความแตกต่างของ function กับ pseudocolumn ไว้อย่างชัดเจนดังนี้
A pseudocolumn behaves like a table column, but is not actually stored in the table.
You can select from pseudocolumns, but you cannot insert, update, or delete their
values. A pseudocolumn is also similar to a function without arguments (refer to
Chapter 5, “Functions”). However, functions without arguments typically return the
same value for every row in the result set, whereas pseudocolumns typically return a
different value for each row.
แปลได้ใจความว่า “ฟังก์ชันที่ไม่ระบุ argument ใด ๆ เมื่อเรียกใช้ใน query จะให้ผลลัพธ์เหมือนกันสำหรับทุกแถว ขณะที่ pseudocolumn อาจให้ผลลัพธ์ที่ต่างกันในแต่ละแถว” ตัวอย่างของ pseudocolumn ที่เห็นกันบ่อย ๆ ก็เช่น rownum, rowid, level, nextval เป็นต้น ซึ่งในแต่ละแถวจะคืนค่าที่ต่างกันได้
แต่หากเราใช้ฟังก์ชั่น sysdate ค่าที่ได้ออกมาจะเป็นวันที่และเวลาขณะเริ่มรัน query นั้นแม้ว่า query นั้นจะใช้เวลาหลายวินาที ค่าที่ได้ก็จะไม่แตกต่างกัน ทำให้ oracle จัด sysdate ให้เป็นฟังก์ชั่นครับ
อนึ่งนิยามนี้น่าจะจำกัดเฉพาะ built in sql function ของ oracle เองเท่านั้น หากเราเขียนฟังก์ชั่นขึ้นมาใช้เอง ก็ไม่จำเป็นว่าจะต้องคืนค่าเดียวกันทุกแถวเสมอไป รวมทั้งใน supplied package ด้วยเช่น dbms_random.value เป็นต้น
หวังว่าหัวข้อนี้จะช่วยลดความสับสนให้กับผู้ที่่ยังใช้ศัพท์สองตัวนี้ไม่ถูกต้องได้บ้างนะครับ