ฟังก์ชัน WMSYS.WM_CONCAT และการเปลี่ยนแปลงเมื่ออัพเกรดไปใช้ Oracle 12c

ฟังก์ชัน WMSYS.WM_CONCAT นักพัฒนาบางท่านที่พัฒนาระบบบนฐานข้อมูล Oracle 10g หรือ 11g อาจจะผ่านตาหรือเคยใช้งานฟังก์ชัน  WMSYS.WM_CONCAT โดยฟังก์ชันนี้เป็นฟังก์ชันที่ใช้ในการนำข้อมูลในฟีลด์เดียวกัน แต่อยู่ต่างเร็คคอร์ดมาเชื่อมต่อกันเป็นข้อมูลเร็คคอร์ดเดียว ในที่นี้จะยกตัวอย่างจากตารางข้อมูลทดสอบ ชื่อว่าตาราง STATIONERY ซึ่งเก็บข้อมูลเครื่องเขียน โดยแยกเป็นสี และระบุจำนวนของเครื่องเขียนแต่และชนิดไว้ ดังนี้   ทดลองใช้คำสั่ง SELECT แบบปกติ ด้วยคำสั่ง SELECT WMSYS.WM_CONCAT(COLOR) COLOR_LIST FROM STATIONERY; ผลลัพธ์ที่ได้   แต่ในเง่การใช้งานส่วนใหญ่ มักจะต้องการแสดงข้อมูลสรุปเป็นกลุ่ม เช่น จากตัวอย่างนี้ ถ้าต้องการแยกข้อมูลสรุปเป็นกลุ่มตามชนิดเครื่องเขียน ว่าเครื่องเขียนแต่ละชนิดมีสีอะไรบ้าง ซึ่งก็สามารถทำได้โดยการเพิ่มการ GROUP BY ตามฟีลด์ STATIONERY เข้าไป ดังนี้ SELECT STATIONERY, WMSYS.WM_CONCAT(COLOR) COLOR_LIST FROM STATIONERY GROUP BY STATIONERY; ผลลัพธ์ที่ได้   หรือหากต้องการข้อมูลสรุปตามสีของเครื่องเขียน ว่าแต่ละสีมีเครื่องเขียนชนิดใดอยู่บ้าง คำสั่งที่ใช้งานก็จะเป็น SELECT … Read more

ข้อจำกัดและข้อควรระวังในการใช้เงื่อนไข IN ในคำสั่ง SELECT บนฐานข้อมูล Oracle

สำหรับบทความนี้ จะนำเสนอข้อจำกัดและข้อควรระวังในการใช้งานคำสั่ง SELECT บนฐานข้อมูล Oracle ซึ่งประสบมาจากการใช้งานจริงสองเรื่องด้วยกัน   เรื่องแรกจะเป็นข้อจำกัดในการใช้เงื่อนไข IN (value1,value2,value3,…) ในคำสั่ง SELECT  ส่วนอีกเรื่องจะเป็นเรื่องของข้อควรระวังในการใช้ IN ร่วมกับเงื่อนไขที่เป็น subquery ในคำสั่ง SELECT  เช่นกัน   การใช้คำสั่ง SELECT และเงื่อนไข IN นั้น เป็นรูปแบบคำสั่งพื้นฐานแบบหนึ่งที่นักพัฒนาที่ทำงานคลุกคลีกับฐานข้อมูลส่วนใหญ่จะคุ้นเคยกันเป็นอย่างดี  โดยรูปแบบที่เรามักจะใช้งานกันบ่อย คือ รูปแบบที่ 1 รูปแบบ SELECT * FROM TABLE1 WHERE FIELD1 IN  (value1,value2,value3,…)  โดยผลลัพธ์จะเป็นรายการข้อมูลในตาราง TABLE1 ที่ค่าของข้อมูลใน FIELD1 มีอยู่ใน value1,value2,value3 ,… รูปแบบที่ 2 คล้ายกับรูปแบบที่ 1  นั่นเอง แต่จะเป็นการใช้ subquery แทนที่ (value1,value2,value3,…)  … Read more

เกร็ดความรู้ประกอบการกู้หรือย้ายฐานข้อมูล SQL Server

Count record แต่ละ tables ใน database SELECT T.name AS [TABLE NAME], I.row_count AS [ROWCOUNT] FROM sys.tables AS T INNER JOIN sys.dm_db_partition_stats AS I ON T.object_id = I.object_id AND I.index_id < 2 ORDER BY I.row_count DESC หา Trigger ทั้งหมดในทุกๆ tables ใน Database SELECT [so].[name] AS [trigger_name], USER_NAME([so].[uid]) AS [trigger_owner], USER_NAME([so2].[uid]) AS [table_schema], OBJECT_NAME([so].[parent_obj]) AS [table_name], OBJECTPROPERTY( [so].[id], ‘ExecIsUpdateTrigger’) AS … Read more

การกู้ Suspect Database ของ SQL Server

Recovery SQL Server Suspect Database สาเหตุของ Suspect Mode การที่ฐานข้อมูล SQL Server เข้าสู่ Mode Suspect นั้นมีได้จากหลายสาเหตุ ดังนี้ Hardware เกิดความเสียหาย มีการปิด (Shutdown) ฐานข้อมูลที่ไม่เหมาะสม คือปิดโดยที่ยังมีกระบวนการทำงานยังไม่เสร็จสมบูรณ์ หรือมีบาง Transaction ค้างอยู่ เกิดความเสียหายกับ Database Files (*.mdf,*.log) SQL Server ไม่พบ Device ที่เก็บ Files SQL Server ไม่พบ Database Files Database Resource ถูกใช้งานอยู่โดย Operation System ไม่มีพื้นที่มากพอใน Page space ที่มีการเพิ่ม (Insert) ข้อมูลเข้าไป วิธีแก้ปัญหา แต่ต้องอยู่บนพื้นฐานที่ไม่มีอะไรผิดปกติที่เกิดจาก Devices หรือ … Read more

T-SQL นับจำนวน record ที่เกิดจากการสั่ง execute Dynamic Query

ตัวอย่างไม่ต้องอธิบายมาก DECLARE @str_SQL NVARCHAR(100), @rowcount INT –กำหนดตัวแปร SET @str_SQL = ‘select * from sysobjects’ — set ค่าให้ตัวแปร EXEC sp_executesql @str_SQL — สั่ง execute dynamic query SELECT @rowcount = @@ROWCOUNT — get ค่าที่จำนวน record ที่เกิดผลกระทบจากการ execute dynamic query PRINT ‘@rowcount = ‘ + CAST(@rowcount AS VARCHAR(4)) — แสดงผลออกหน้าจอ