Oracle แทรก PL/SQL อัปเดต ลบ & เลือกลงใน [ตัวอย่าง]

⚡ สรุปอย่างชาญฉลาด

คำสั่ง SQL ภายใน Oracle PL/SQL จัดการงานประมวลผลข้อมูลทุกอย่าง ช่วยให้สามารถแทรก อัปเดต ลบ และเลือกแถวได้โดยตรง คำสั่ง INSERT, UPDATE, DELETE และ SELECT INTO ใช้สำหรับย้ายและดึงข้อมูลภายในฐานข้อมูล

  • ⚙️ คำสั่ง DML: คำสั่ง INSERT, UPDATE, DELETE และ SELECT INTO ทำงานเกี่ยวกับการจัดการข้อมูลทุกอย่างภายในบล็อก PL/SQL
  • การแทรกข้อมูล: คำสั่ง INSERT INTO เพิ่มแถวจากค่าที่ระบุอย่างชัดเจน หรือจากตารางอื่นโดยตรงโดยใช้คำสั่ง SELECT
  • 🔄 อัปเดตข้อมูล: คำสั่ง UPDATE ร่วมกับ SET จะเปลี่ยนค่าในคอลัมน์ ในขณะที่เงื่อนไข WHERE ที่เป็นตัวเลือกจะจำกัดจำนวนแถวที่ได้รับผลกระทบ
  • 🗑️ การลบข้อมูล: คำสั่ง DELETE จะลบเรคอร์ดที่ตรงกับเงื่อนไข และหากไม่ใส่เงื่อนไข WHERE จะล้างข้อมูลทั้งตาราง
  • 🎯 เลือกเข้าสู่: คำสั่ง SELECT INTO ต้องส่งคืนข้อมูลเพียงแถวเดียวเท่านั้น หรือ Oracle อาจเกิดข้อผิดพลาด NO_DATA_FOUND หรือ TOO_MANY_ROWS
  • 🤖 ความช่วยเหลือจาก AI: ผู้ช่วย AI เช่น GitHub Copilot จะร่างบล็อก DML และแจ้งเตือนหากขาดคำสั่ง WHERE หรือ COMMIT

Oracle PL/SQL Insert Update Delete Select Into

ธุรกรรม DML ใน PL/SQL

DML ย่อมาจาก Data Manipulation Language ซึ่งเป็นกลุ่มของภาษาสำหรับจัดการข้อมูล (Data Manipulation Language) SQL คำสั่งที่เปลี่ยนแปลงข้อมูลที่จัดเก็บไว้ในตาราง ภายใน บล็อก PL/SQLคำสั่งเหล่านี้ทำหน้าที่ประมวลผลข้อมูล ในขณะที่ PL/SQL จัดเตรียมตรรกะโดยรอบ ส่วน DML จัดการกับการดำเนินการดังต่อไปนี้

  • การแทรกข้อมูล
  • อัปเดตข้อมูล
  • การลบข้อมูล
  • การเลือกข้อมูล

ใน PL/SQL การจัดการข้อมูลจะทำได้ผ่านคำสั่ง SQL เท่านั้น

การแทรกข้อมูล

ใน PL/SQL การเพิ่มแถวลงในตารางจะใช้คำสั่ง SQL INSERT INTO คำสั่งนี้รับชื่อตาราง คอลัมน์เป้าหมาย และค่าของคอลัมน์เป็นอินพุต จากนั้นจะแทรกค่าลงในตารางหลัก

คำสั่ง INSERT ยังสามารถดึงค่าจากตารางอื่นโดยตรงโดยใช้คำสั่ง SELECT แทนการระบุค่าสำหรับแต่ละคอลัมน์ได้ โดยใช้คำสั่ง SELECT สามารถแทรกข้อมูลได้มากเท่ากับจำนวนแถวที่มีอยู่ในตารางต้นทางในครั้งเดียว

ไวยากรณ์:

BEGIN
INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>)
VALUES(<value1>,<value2>,...,<value_n>);
END;

ไวยากรณ์ข้างต้นแสดงคำสั่ง INSERT INTO ชื่อตารางและค่าเป็นฟิลด์ที่จำเป็น ในขณะที่ชื่อคอลัมน์เป็นตัวเลือกเมื่อคำสั่ง INSERT ระบุค่าสำหรับทุกคอลัมน์ของตาราง คำว่า VALUES เป็นคำที่จำเป็นเมื่อระบุค่าแยกต่างหาก ดังที่แสดงไว้ข้างต้น

ไวยากรณ์:

BEGIN
INSERT INTO <table_name>(<column1>,<column2>,...,<column_n>)
SELECT <column1>,<column2>,...,<column_n> FROM <table_name2>;
END;

รูปแบบที่สองของคำสั่ง INSERT INTO นี้จะดึงค่าโดยตรงจาก โดยใช้คำสั่ง SELECT คำว่า VALUES ต้องไม่ปรากฏที่นี่ เนื่องจากค่าต่างๆ ไม่ได้ถูกระบุแยกต่างหาก

อัปเดตข้อมูล

การอัปเดตข้อมูลหมายถึงการเปลี่ยนแปลงค่าของคอลัมน์ในแถวที่มีอยู่แล้ว ทำได้โดยใช้คำสั่ง UPDATE ซึ่งรับชื่อตาราง ชื่อคอลัมน์ และค่าใหม่เป็นอินพุต และทำการอัปเดตข้อมูล

ไวยากรณ์:

BEGIN
UPDATE <table_name>
SET <column1>=<value1>,<column2>=<value2>,<column_n>=<value_n>
WHERE <condition that uniquely identifies the record that needs to be updated>;
END;

ไวยากรณ์ข้างต้นแสดงคำสั่ง UPDATE คำหลัก SET สั่งให้เอนจิน PL/SQL อัปเดตคอลัมน์ด้วยค่าที่กำหนด ส่วนเงื่อนไข WHERE นั้นเป็นตัวเลือก หากไม่ได้ระบุไว้ ค่าของคอลัมน์ที่กล่าวถึงจะถูกอัปเดตในตารางทั้งหมด

การลบข้อมูล

การลบข้อมูลหมายถึงการลบข้อมูลทั้งหมดหนึ่งรายการออกจากตารางฐานข้อมูล โดยใช้คำสั่ง DELETE ในการดำเนินการนี้

ไวยากรณ์:

BEGIN
DELETE FROM <table_name>
WHERE <condition that uniquely identifies the record that needs to be deleted>;
END;

ไวยากรณ์ข้างต้นแสดงคำสั่ง DELETE คำว่า FROM เป็นตัวเลือก และไม่ว่าจะมีหรือไม่มีส่วน FROM คำสั่งก็จะทำงานเหมือนกัน ส่วน WHERE ก็เป็นตัวเลือกเช่นกัน หากไม่ได้ระบุไว้ ระบบจะล้างข้อมูลในตารางทั้งหมด

การเลือกข้อมูล

การดึงข้อมูลหรือการเรียกค้นข้อมูล หมายถึงการดึงข้อมูลที่ต้องการจากตารางในฐานข้อมูล ซึ่งทำได้โดยใช้คำสั่ง SELECT ร่วมกับส่วนคำสั่ง INTO คำสั่ง SELECT จะดึงค่าจากฐานข้อมูล และส่วนคำสั่ง INTO จะกำหนดค่าเหล่านั้นให้กับตัวแปรภายในบล็อก PL/SQL

ควรพิจารณาประเด็นต่อไปนี้เมื่อใช้คำสั่ง SELECT ร่วมกับ INTO:

  • คำสั่ง SELECT ควรส่งคืนข้อมูลเพียงหนึ่งรายการเมื่อใช้ส่วน INTO เนื่องจากตัวแปรหนึ่งตัวสามารถเก็บค่าได้เพียงค่าเดียว หากคำสั่ง SELECT ส่งคืนมากกว่าหนึ่งแถว ข้อผิดพลาด TOO_MANY_ROWS ถูกยกขึ้น
  • คำสั่ง SELECT จะกำหนดค่าให้กับตัวแปรในส่วน INTO ดังนั้นจึงจำเป็นต้องมีอย่างน้อยหนึ่งระเบียนเพื่อเติมค่าลงไป หากไม่พบระเบียนใด ๆ จะเกิดข้อผิดพลาด NO_DATA_FOUND ขึ้น
  • จำนวนคอลัมน์และชนิดข้อมูลในส่วน SELECT ควรตรงกับจำนวนตัวแปรและชนิดข้อมูลในส่วน INTO
  • ค่าต่างๆ จะถูกดึงออกมาและเติมในลำดับเดียวกับที่กล่าวไว้ในคำสั่ง
  • เงื่อนไข WHERE เป็นส่วนเสริมที่ไม่จำเป็น และช่วยให้คุณกำหนดข้อจำกัดเพิ่มเติมสำหรับข้อมูลที่ดึงมาได้
  • คำสั่ง SELECT สามารถใช้ในเงื่อนไข WHERE ของคำสั่ง DML อื่นๆ เพื่อกำหนดค่าของเงื่อนไขได้
  • คำสั่ง SELECT ที่ใช้ภายในคำสั่ง INSERT, UPDATE หรือ DELETE ไม่ควรมีส่วน INTO เนื่องจากในกรณีเหล่านั้นจะไม่ทำการกำหนดค่าให้กับตัวแปรใดๆ

ไวยากรณ์:

BEGIN
SELECT <column1>,...,<column_n> INTO <variable1>,...,<variable_n>
FROM <table_name>
WHERE <condition to fetch the required records>;
END;

ไวยากรณ์ข้างต้นแสดงคำสั่ง SELECT-INTO คำว่า FROM เป็นคำที่จำเป็นและระบุตารางที่ต้องการดึงข้อมูล ส่วนคำสั่ง WHERE เป็นตัวเลือก หากไม่ได้ระบุ ข้อมูลจากทั้งตารางจะถูกดึงมา

1 ตัวอย่าง: ในตัวอย่างนี้ เราจะมาดูวิธีการดำเนินการ DML ใน PL/SQL กัน เราจะแทรกข้อมูลสี่รายการด้านล่างลงในตาราง emp

อีเอ็มพี_NAME EMP_NO เงินเดือน MANAGER
BBB 1000 25000 AAA
XXX 1001 10000 BBB
YYY 1002 10000 BBB
ZZZ 1003 7500 BBB

จากนั้นเราจะอัปเดตเงินเดือนของ 'XXX' เป็น 15000 ลบข้อมูลพนักงาน 'ZZZ' และสุดท้ายแสดงรายละเอียดของพนักงาน 'XXX'

ภาพหน้าจอด้านล่างแสดงบล็อก PL/SQL ฉบับสมบูรณ์ที่ใช้ในตัวอย่างนี้

Oracle บล็อก PL/SQL ที่ทำการแทรก อัปเดต ลบ และเลือกข้อมูลลงในตาราง emp

DECLARE
l_emp_name VARCHAR2(250);
l_emp_no NUMBER;
l_salary NUMBER;
l_manager VARCHAR2(250);
BEGIN
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('BBB',1000,25000,'AAA');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('XXX',1001,10000,'BBB');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('YYY',1002,10000,'BBB');
INSERT INTO emp(emp_name,emp_no,salary,manager)
VALUES('ZZZ',1003,7500,'BBB');
COMMIT;
Dbms_output.put_line('Values Inserted');
UPDATE EMP
SET salary=15000
WHERE emp_name='XXX';
COMMIT;
Dbms_output.put_line('Values Updated');
DELETE emp WHERE emp_name='ZZZ';
COMMIT;
Dbms_output.put_line('Values Deleted');
SELECT emp_name,emp_no,salary,manager INTO l_emp_name,l_emp_no,l_salary,l_manager FROM emp WHERE emp_name='XXX';
Dbms_output.put_line('Employee Detail');
Dbms_output.put_line('Employee Name:'||l_emp_name);
Dbms_output.put_line('Employee Number:'||l_emp_no);
Dbms_output.put_line('Employee Salary:'||l_salary);
Dbms_output.put_line('Employee Manager Name:'||l_manager);
END;
/

Output:

Values Inserted
Values Updated
Values Deleted
Employee Detail
Employee Name:XXX
Employee Number:1001
Employee Salary:15000
Employee Manager Name:BBB

Code คำอธิบาย:

  • Code บรรทัดที่ 2-5: การประกาศตัวแปร
  • Code บรรทัดที่ 7-14: แทรกข้อมูลลงในตาราง emp
  • Code สาย 15: กำลังยืนยันรายการแทรกข้อมูล
  • Code บรรทัดที่ 17-19: ปรับเงินเดือนของพนักงาน 'XXX' เป็น 15000 บาท
  • Code สาย 20: กำลังยืนยันธุรกรรมการอัปเดต
  • Code สาย 22: กำลังลบข้อมูลของ 'ZZZ'
  • Code สาย 23: ยืนยันการลบข้อมูล
  • Code สาย 25: เลือกข้อมูลของ 'XXX' และกำหนดค่าให้กับตัวแปร l_emp_name, l_emp_no, l_salary และ l_manager
  • Code บรรทัดที่ 26-30: แสดงค่าบันทึกที่ดึงมาได้

คำถามที่พบบ่อย

ไม่ PL/SQL แบบคงที่ไม่สามารถรัน DDL ได้โดยตรง ต้องสร้างคำสั่งเป็นสตริงแล้วจึงเรียกใช้ด้วย ดำเนินการทันทีซึ่งจะจัดการคำสั่ง CREATE, ALTER และ DROP ในระหว่างการทำงาน

คำสั่ง SELECT INTO ต้องส่งคืนข้อมูลเพียงแถวเดียวเท่านั้น หากต้องการอ่านข้อมูลหลายแถว ให้ใช้คำสั่ง SELECT INTO ที่ระบุอย่างชัดเจน เคอร์เซอร์ โดยใช้ลูป FETCH หรือ BULK COLLECT INTO ลงในคอลเลกชัน

คำสั่ง DELETE เป็นคำสั่ง DML: ใช้ลบแถวที่เลือกโดยใช้เงื่อนไข WHERE และสามารถย้อนกลับได้ ส่วนคำสั่ง TRUNCATE เป็นคำสั่ง DDL: ลบทุกแถวทันที ยืนยันการเปลี่ยนแปลงโดยอัตโนมัติ และไม่สามารถยกเลิกได้

ใช่แล้ว การเปลี่ยนแปลงแบบ INSERT, UPDATE และ DELETE จะคงอยู่ในเซสชันของคุณจนกว่าคุณจะยกเลิก COMMITPL/SQL ไม่ทำการยืนยันการเปลี่ยนแปลงโดยอัตโนมัติ ให้ใช้คำสั่ง COMMIT เพื่อบันทึก หรือ ROLLBACK เพื่อยกเลิกการเปลี่ยนแปลง

คำสั่ง MERGE ทำงานแบบ upsert คืออัปเดตแถวที่ตรงกับเงื่อนไขการเชื่อมต่อและแทรกแถวที่ไม่ตรงตามเงื่อนไข ในคำสั่งเดียว แทนที่จะใช้คำสั่ง UPDATE และ INSERT แยกกัน

คำสั่ง RETURNING INTO จะดึงค่าคอลัมน์จากแถวที่คำสั่ง INSERT, UPDATE หรือ DELETE เพิ่งทำการแก้ไข และเก็บค่าเหล่านั้นไว้ในตัวแปร โดยไม่ต้องใช้คำสั่ง SELECT เพิ่มเติมเพื่ออ่านข้อมูลที่เปลี่ยนแปลงไป

ใช่. นักบิน GitHub ร่างบล็อกคำสั่ง INSERT, UPDATE, DELETE และ SELECT INTO จากข้อความอธิบายสั้นๆ แนะนำตัวแปรผูกมัด และเติมเต็มรายการคอลัมน์ แต่คุณควรตรวจสอบตรรกะก่อน

ผู้ช่วย AI จะสแกน DML เพื่อหาเงื่อนไข WHERE ที่หายไป คำสั่ง COMMIT ที่ไม่มีอยู่ และการเชื่อมต่อข้อมูลที่ไม่ปลอดภัย จากนั้นจะแนะนำวิธีแก้ไขและอธิบายข้อผิดพลาด การตรวจสอบด้วยแมชชีนเลิร์นนิงนี้ช่วยตรวจจับการเปลี่ยนแปลงที่มีความเสี่ยงก่อนที่จะนำไปใช้งานจริง

สรุปโพสต์นี้ด้วย: