การใช้การจัดการข้อมูล

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 ในการให้ความสอดคล้องในการอ่าน

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

การควบคุมเมื่อข้อมูลที่แก้ไขสามารถมองเห็นได้โดยธุรกรรมอื่น ๆ ของฐานข้อมูลสำหรับการอ่านหรืออัปเดต