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.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم المساعدات المدعومة بالذكاء الاصطناعي مثل GitHub Copilot بصياغة كتل DML وتحديد شرط WHERE أو COMMIT المفقود.

Oracle PL/SQL إدراج تحديث حذف تحديد في

معاملات DML في PL/SQL

DML اختصار لـ Data Manipulation Language، وهي مجموعة من SQL أوامر تُغيّر البيانات المخزنة في جدول. ضمن كتلة بل/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 اختيارية، ويتصرف الأمر بنفس الطريقة سواءً استخدمتَها أم لا. أما شرط 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).

EMP_NAME EMP_NO المرتبات مدير
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;
/

الإخراج:

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: إدخال السجلات في جدول الموظفين.
  • 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 مباشرةً. قم بإنشاء العبارة كسلسلة نصية ونفذها باستخدام نفِّذها فورًا، والتي تتعامل مع عمليات الإنشاء والتعديل والحذف في وقت التشغيل.

يجب أن تُرجع عبارة SELECT INTO صفًا واحدًا فقط. لقراءة عدة صفوف، استخدم عبارة SELECT INTO صريحة. المؤشر باستخدام حلقة FETCH، أو BULK COLLECT INTO مجموعة.

عملية الحذف (DELETE) هي عملية DML: تزيل الصفوف المحددة باستخدام شرط WHERE ويمكن التراجع عنها. أما عملية الحذف (TRUNCATE) فهي عملية DDL: تمسح جميع الصفوف فورًا، وتُنفذ التغييرات تلقائيًا، ولا يمكن التراجع عنها.

نعم. تبقى التغييرات التي تُجرى عبر عمليات الإضافة والتحديث والحذف محفوظة في جلستك حتى تقوم بـ ارتكبلا يقوم PL/SQL بالحفظ التلقائي. استخدم الأمر COMMIT للحفظ أو ROLLBACK للتراجع.

يقوم الأمر MERGE بتنفيذ عملية التحديث والإدراج - حيث يقوم بتحديث الصفوف التي تطابق شرط الربط وإدراج تلك التي لا تطابقه - في عبارة واحدة بدلاً من عمليات التحديث والإدراج المنفصلة.

تقوم عبارة RETURNING INTO بالتقاط قيم الأعمدة من الصفوف التي أثرت عليها عملية INSERT أو UPDATE أو DELETE للتو وتخزينها في متغيرات، مما يجنب الحاجة إلى استعلام SELECT إضافي لقراءة البيانات المتغيرة.

نعم. مساعد الطيار جيثب يقوم البرنامج بإنشاء كتل INSERT و UPDATE و DELETE و SELECT INTO من تعليق قصير، ويقترح متغيرات الربط، ويكمل قوائم الأعمدة، على الرغم من أنه يجب عليك مراجعة المنطق أولاً.

تقوم مساعدات الذكاء الاصطناعي بفحص لغة معالجة البيانات (DML) بحثًا عن عبارات WHERE المفقودة، وغياب أوامر COMMIT، وعمليات الربط غير الآمنة، ثم تقترح حلولًا وتشرح الأخطاء. يكشف هذا التدقيق الآلي التغييرات الخطيرة قبل وصولها إلى بيئة الإنتاج.

تلخيص هذه التدوينة بـ: