การใช้การจัดการข้อมูล
Oracle จัดเตรียมคำสั่ง Data Manipulation Language เพื่อใช้การดำเนินการกับข้อมูลในฐานข้อมูลการดำเนินการกับข้อมูลสามารถเติมข้อมูลในตารางฐานข้อมูลด้วยแอปพลิเคชันหรือข้อมูลธุรกิจแก้ไขข้อมูลและลบข้อมูลออกจากฐานข้อมูลได้ทุกเมื่อที่ต้องการ นอกจากการดำเนินการกับข้อมูลแล้วยังมีชุดคำสั่งที่ใช้เพื่อควบคุมการดำเนินการเหล่านี้คำสั่งเหล่านี้ถูกจัดกลุ่มเป็นภาษาควบคุมธุรกรรม
มีคำสั่ง DML สามประเภทที่เกี่ยวข้องกับธุรกรรม SQL แบบลอจิคัล ได้แก่ แทรกอัปเดตลบและผสานธุรกรรมคือการรวบรวมเชิงตรรกะของการดำเนินการ DML ภายในเซสชันฐานข้อมูล
คำสั่ง INSERT
คำสั่ง INSERT ใช้เพื่อเก็บข้อมูลในตาราง คำสั่ง INSERT มักใช้ในภาษาโปรแกรมระดับสูงกว่าเช่น Visual Basic.NET หรือ C ++ เป็นคำสั่ง SQL แบบฝัง อย่างไรก็ตามคำสั่งนี้สามารถดำเนินการได้ที่พรอมต์ SQL * PLUS ในโหมดคำสั่งคำสั่ง INSERT มีสองรูปแบบที่แตกต่างกัน รูปแบบแรกจะใช้หากแถวใหม่จะมีค่าแทรกในแต่ละคอลัมน์ของแถว รูปแบบที่สองของคำสั่ง INSERT ใช้เพื่อแทรกแถวที่ข้อมูลคอลัมน์บางส่วนไม่เป็นที่รู้จักหรือผิดนัดจากตรรกะทางธุรกิจอื่นรูปแบบของคำสั่ง INSERT นี้ต้องการให้คุณระบุชื่อคอลัมน์ที่จะจัดเก็บข้อมูล
ไวยากรณ์:
คุณสามารถปฏิบัติตามไวยากรณ์ด้านล่างได้หากค่าของคอลัมน์ทั้งหมดในตารางเป็นที่แน่นอนและเป็นที่รู้จัก
INSERT INTO table
VALUES (column1 value, column2 value,
...);
คุณสามารถใช้ไวยากรณ์ด้านล่างได้หากต้องเติมค่าเพียงไม่กี่คอลัมน์จากตาราง คอลัมน์ที่เหลือสามารถอนุมานค่าได้ไม่ว่าจะเป็น NULL หรือจากตรรกะทางธุรกิจอื่น
INSERT INTO table (column1 name, column2 name, . . .)
VALUES (column1 value, column2 value, . . .);
คำสั่ง INSERT ด้านล่างสร้างประวัติพนักงานใหม่ในตาราง EMPLOYEES โปรดทราบว่าจะแทรกค่าสำหรับคอลัมน์หลัก EMPLOYEE_ID, FIRST_NAME, SALARY และ DEPARTMENT_ID
INSERT INTO employees (EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID)
VALUES (130, 'KEMP', 3800, 10);
มิฉะนั้นข้อมูลพนักงานทั้งหมดสามารถแทรกลงในตารางพนักงานได้โดยไม่ต้องระบุรายการคอลัมน์โดยใช้คำสั่ง INSERT ด้านล่าง - หากทราบค่าล่วงหน้าและต้องสอดคล้องกับประเภทข้อมูลและตำแหน่งของคอลัมน์ในตาราง
INSERT INTO employees
VALUES (130, 'KEMP','GARNER', '[email protected]', '48309290',TO_DATE ('01-JAN-2012'), 'SALES', 3800, 0, 110, 10);
ค่าที่จะแทรกต้องเข้ากันได้กับชนิดข้อมูลของคอลัมน์ ตัวอักษรค่าคงที่และค่าพิเศษเช่นฟังก์ชัน SYSDATE, CURRENT_DATE, SEQ.CURRVAL (NEXTVAL) หรือ USER สามารถใช้เป็นค่าคอลัมน์ได้ ค่าที่ระบุต้องเป็นไปตามกฎทั่วไป ตัวอักษรสตริงและค่าวันที่ต้องอยู่ในเครื่องหมายคำพูด ค่าวันที่สามารถระบุได้ในรูปแบบ DD-MON-RR หรือ D-MON-YYYY แต่เป็นที่ต้องการของ YYYY เนื่องจากระบุศตวรรษอย่างชัดเจนและไม่ขึ้นอยู่กับตรรกะการคำนวณภายในศตวรรษที่ RR
คำสั่ง INSERT-AS-SELECT (IAS)
ข้อมูลสามารถบรรจุลงในตารางเป้าหมายจากตารางต้นทางโดยใช้การดำเนินการ INSERT..AS..SELECT (IAS) มันเป็นการดำเนินการอ่านเส้นทางโดยตรงเป็นวิธีง่ายๆในการสร้างสำเนาของข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่งหรือสร้างสำเนาสำรองของตารางซึ่งการดำเนินการของตารางต้นทางออนไลน์อยู่
ตัวอย่างเช่นสามารถคัดลอกข้อมูลจากตาราง EMPLOYEES ไปยังตาราง EMP_HISTORY
INSERT INTO EMP_HISTORY
SELECT EMPLOYEE_ID, EMPLOYEE_NAME, SALARY, DEPARTMENT_ID
FROM employees;
คำสั่ง UPDATE
คำสั่ง UPDATE แก้ไขข้อมูลที่จัดเก็บในคอลัมน์โดยสามารถอัปเดตแถวเดียวหรือหลายแถวได้ในแต่ละครั้งขึ้นอยู่กับชุดผลลัพธ์ที่กรองตามเงื่อนไขที่ระบุในส่วนคำสั่ง WHERE โปรดทราบว่าการอัปเดตคอลัมน์จะแตกต่างจากการแก้ไขคอลัมน์ ก่อนหน้านี้ในบทนี้คุณได้ศึกษาคำสั่ง ALTER คำสั่ง ALTER เปลี่ยนโครงสร้างตาราง แต่ปล่อยให้ข้อมูลตารางไม่ได้รับผลกระทบคำสั่ง UPDATE จะเปลี่ยนข้อมูลในตารางไม่ใช่โครงสร้างตาราง
ไวยากรณ์:
UPDATE table
SET column = value [, column = value ...]
[WHERE condition]
จากไวยากรณ์
คอลัมน์ SET = นิพจน์สามารถรวมกันของอักขระสูตรหรือฟังก์ชันใดก็ได้ที่จะอัปเดตข้อมูลในชื่อคอลัมน์ที่ระบุส่วนคำสั่ง WHERE เป็นทางเลือก แต่ถ้ารวมไว้จะระบุว่าจะอัปเดตแถวใดมีเพียงตารางเดียวเท่านั้น อัปเดตในแต่ละครั้งด้วยคำสั่ง UPDATE
คำสั่ง UPDATE ด้านล่างจะอัปเดตเงินเดือนของพนักงาน JOHN เป็น 5,000
UPDATE employees
SET salary = 5000
WHERE UPPER (first_name) = 'JOHN';
แม้ว่าเพรดิเคต WHERE จะเป็นทางเลือก แต่ต้องต่อท้ายตามเหตุผลเพื่อแก้ไขเฉพาะแถวที่ต้องการในตาราง คำสั่ง UPDATE ด้านล่างจะอัปเดตเงินเดือนของพนักงานทั้งหมดในตาราง
UPDATE employees
SET salary = 5000;
นอกจากนี้ยังสามารถอัปเดตหลายคอลัมน์ได้โดยระบุหลายคอลัมน์ในประโยค SET คั่นด้วยเครื่องหมายจุลภาค ตัวอย่างเช่นหากต้องเปลี่ยนทั้งเงินเดือนและหน้าที่การงานเป็น 5,000 และ SALES ตามลำดับสำหรับ JOHN คำสั่ง UPDATE จะมีลักษณะดังนี้
UPDATE employees
SET SALARY = 5000,
JOB_ID = 'SALES'
WHERE UPPER (first_name) = 'JOHN';
1 row updated.
อีกวิธีหนึ่งในการอัปเดตหลายคอลัมน์ในแถวเดียวกันจะแสดงการใช้แบบสอบถามย่อย
UPDATE employees
SET (SALARY, JOB_ID) = (SELECT 5000, 'SALES' FROM DUAL)
WHERE UPPER (ENAME) = 'JOHN'
คำสั่ง DELETE
คำสั่ง DELETE เป็นหนึ่งในคำสั่ง SQL ที่ง่ายที่สุด จะลบแถวอย่างน้อยหนึ่งแถวออกจากตาราง ไม่อนุญาตให้ทำการลบตารางหลายรายการใน SQL ไวยากรณ์ของคำสั่ง DELETE มีดังต่อไปนี้
DELETE FROM table_name
[WHERE condition];
คำสั่ง DELETE ลบแถวทั้งหมดในตารางที่ตรงตามเงื่อนไขในส่วนคำสั่ง WHERE ที่เป็นทางเลือก เนื่องจากคำสั่ง WHERE เป็นทางเลือกหนึ่งจึงสามารถลบแถวทั้งหมดออกจากตารางได้อย่างง่ายดายโดยการละเว้น WHERE clause เนื่องจาก WHERE clause จำกัด ขอบเขตของการดำเนินการ DELETE
คำสั่ง DELETE ด้านล่างจะลบรายละเอียดของ EDWIN ออกจากตาราง EMP
DELETE employees
WHERE UPPER (ENAME) = 'EDWIN'
1 row deleted.
หมายเหตุ: DELETE [TABLE NAME] และ DELETE FROM [TABLE NAME] มีความหมายเหมือนกัน
เงื่อนไข WHERE ในคำสั่งการลบตามเงื่อนไขสามารถใช้ประโยชน์จากการสืบค้นย่อยดังที่แสดงด้านล่าง
DELETE FROM employees
WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID
FROM LOCATIONS
WHERE LOCATION_CODE = 'SFO')
ตัด
Truncate เป็นคำสั่ง DDL ที่ใช้เพื่อล้างข้อมูลทั้งหมดออกจากตาราง แต่ยังคงรักษาโครงสร้างตารางไว้ ไม่สนับสนุนเงื่อนไข WHERE ในการลบระเบียนที่เลือก
ไวยากรณ์:
TRUNCATE [table name]
เป็น Auto Commit กล่าวคือเป็นการทำธุรกรรมที่ใช้งานอยู่ในเซสชัน การตัดทอนตารางจะไม่ทำให้ดัชนีอ้างอิงทริกเกอร์หรือข้อ จำกัด ของตารางลดลง ถ้าตาราง A เป็นพาเรนต์ของข้อ จำกัด การอ้างอิงของตาราง B ในฐานข้อมูลตาราง A จะไม่สามารถตัดทอนได้
การทำธุรกรรม
ธุรกรรมคือหน่วยตรรกะของงานที่ทำในฐานข้อมูล สามารถมี -
คำสั่ง DML หลายคำสั่งที่ลงท้ายด้วยคำสั่ง TCL เช่น COMMIT หรือ ROLLBACK
คำสั่ง DDL หนึ่งคำสั่ง
คำสั่ง DCL หนึ่งคำสั่ง
จุดเริ่มต้นของธุรกรรมถูกทำเครื่องหมายด้วยคำสั่ง DML แรก ลงท้ายด้วยคำสั่ง TCL, DDL หรือ DCL คำสั่ง TCL เช่น COMMIT หรือ ROLLBACK เป็นปัญหาอย่างชัดเจนในการยุติธุรกรรมที่ใช้งานอยู่ โดยอาศัยพฤติกรรมพื้นฐานของพวกเขาหากคำสั่ง DDL หรือ DCL ใด ๆ ถูกดำเนินการในเซสชันฐานข้อมูลให้กระทำธุรกรรมที่ใช้งานอยู่ในเซสชัน หากอินสแตนซ์ฐานข้อมูลล่มผิดปกติธุรกรรมจะหยุดลง
COMMIT, ROLLBACK และ SAVEPOINT เป็นภาษาควบคุมธุรกรรม COMMIT ใช้การเปลี่ยนแปลงข้อมูลอย่างถาวรในฐานข้อมูลในขณะที่ ROLLBACK ดำเนินการต่อต้านการคอมมิต SAVEPOINT ควบคุมชุดของธุรกรรมโดยการตั้งค่าเครื่องหมายในขั้นตอนการทำธุรกรรมที่แตกต่างกัน ผู้ใช้สามารถย้อนกลับธุรกรรมปัจจุบันไปยังจุดบันทึกที่ต้องการซึ่งตั้งไว้ก่อนหน้านี้
COMMIT- Commit สิ้นสุดธุรกรรมที่ใช้งานอยู่ในปัจจุบันโดยใช้การเปลี่ยนแปลงข้อมูลอย่างถาวรในตารางฐานข้อมูล COMMIT คือคำสั่ง TCL ที่จบธุรกรรมอย่างชัดเจน อย่างไรก็ตามคำสั่ง DDL และ DCL กระทำธุรกรรมโดยปริยาย
SAVEPOINT- Savepoint ใช้เพื่อทำเครื่องหมายจุดที่เฉพาะเจาะจงในธุรกรรมปัจจุบันในเซสชัน เนื่องจากเป็นเครื่องหมายตรรกะในธุรกรรมจึงไม่สามารถสอบถามจุดบันทึกในพจนานุกรมข้อมูลได้
ROLLBACK- คำสั่ง ROLLBACK ใช้เพื่อสิ้นสุดธุรกรรมทั้งหมดโดยการยกเลิกการเปลี่ยนแปลงข้อมูล หากธุรกรรมมีจุดบันทึกที่ทำเครื่องหมายไว้สามารถใช้ ROLLBACK TO SAVEPOINT [name] เพื่อย้อนกลับธุรกรรมได้ถึงจุดบันทึกที่ระบุเท่านั้น ด้วยเหตุนี้ข้อมูลทั้งหมดที่เปลี่ยนแปลงไปจนถึงจุดบันทึกที่ระบุจะถูกละทิ้ง
สาธิต
พิจารณาตารางพนักงานซึ่งมีรายละเอียดพนักงานที่ได้รับการว่าจ้างใหม่ในช่วงไตรมาสแรกของทุกปี พนักงานธุรการจะต่อท้ายรายละเอียดของพนักงานแต่ละคนด้วยจุดประหยัดเพื่อที่จะย้อนกลับข้อมูลที่ผิดพลาดได้ตลอดเวลาระหว่างกิจกรรมการป้อนข้อมูล สังเกตว่าเขาใช้ชื่อ savepoint เหมือนกับชื่อพนักงาน
INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (105, 'Allen',TO_DATE ('15-JAN-2013','SALES',10000,10);
SAVEPOINT Allen;
INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',10000,20);
SAVEPOINT Kate;
INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',12000,30);
SAVEPOINT McMan;
สมมติว่าเจ้าหน้าที่ป้อนข้อมูลรู้ตัวว่าป้อนเงินเดือนของ 'Kate' และ 'McMan' ผิด เขาย้อนกลับธุรกรรมที่ใช้งานอยู่ไปที่เซฟพอยท์เคทและป้อนรายละเอียดพนักงานของเคทและแมคแมนอีกครั้ง
ROLLBACK TO SAVEPOINT Kate;
INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',12500,20);
SAVEPOINT Kate;
INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id)
VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',13200,30);
SAVEPOINT McMan;
เมื่อป้อนข้อมูลเสร็จแล้วเขาสามารถทำธุรกรรมทั้งหมดได้โดยการออก COMMIT ในเซสชันปัจจุบัน
อ่านความสม่ำเสมอ
Oracle รักษาความสอดคล้องของผู้ใช้ในแต่ละเซสชันในแง่ของการเข้าถึงข้อมูลและการดำเนินการอ่าน / เขียน
เมื่อ DML เกิดขึ้นบนตารางค่าข้อมูลดั้งเดิมที่เปลี่ยนแปลงโดยการกระทำจะถูกบันทึกไว้ในฐานข้อมูลการเลิกทำเรกคอร์ด ตราบใดที่ธุรกรรมไม่ได้ถูกผูกมัดในฐานข้อมูลผู้ใช้ในเซสชันอื่นที่ค้นหาข้อมูลที่แก้ไขในภายหลังจะดูค่าข้อมูลดั้งเดิม Oracle ใช้ข้อมูลปัจจุบันในพื้นที่ส่วนกลางของระบบและข้อมูลในระเบียนเลิกทำเพื่อสร้างมุมมองที่สอดคล้องกันในการอ่านข้อมูลของตารางสำหรับแบบสอบถาม เฉพาะเมื่อมีการทำธุรกรรมการเปลี่ยนแปลงของธุรกรรมจะเกิดขึ้นอย่างถาวร ธุรกรรมเป็นกุญแจสำคัญในกลยุทธ์ของ Oracle ในการให้ความสอดคล้องในการอ่าน
จุดเริ่มต้นสำหรับมุมมองที่อ่านสอดคล้องกันถูกสร้างขึ้นในนามของผู้อ่าน
การควบคุมเมื่อข้อมูลที่แก้ไขสามารถมองเห็นได้โดยธุรกรรมอื่น ๆ ของฐานข้อมูลสำหรับการอ่านหรืออัปเดต