سؤال أوراكل الأساسي
-
30-09-2019 - |
سؤال
أنا جديد على أوراكل. عندما أقوم بإنشاء إجراء مخزن باستخدام:
CREATE OR REPLACE PROCEDURE PROCEDURE1
AS
BEGIN
SELECT FIRSTNAME,
LASTNAME
INTO FirstName,LastName
FROM EMPLOYEE;
END PROCEDURE1;
أحصل على الأخطاء التالية:
يجب الإعلان عن بيان PL/SQL المعرف الذي تم تجاهله FirstName معرف ORA-00904 غير صالح
المحلول
أعتقد أن الكلمة الرئيسية "AS" لن تعمل. إذا لم ينجح ، فاستخدم "هو".
الباقي على غرار ونصائح جيدة جدا.
إذا كنت بحاجة إلى أي مساعدة بخصوص PL/SQL ، فيمكنك إلقاء نظرة على هذا الرابط. إنه بسيط للغاية وسهل الفهم ؛
http://plsql-tutorial.com/
هذا هو الحل الخاص بي للخطأ الذي تحصل عليه ؛
CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
v_FIRSTNAME EMPLOYEE.FIRSTNAME%TYPE;
v_LASTNAME EMPLOYEE.LASTNAME%TYPE;
CURSOR EMPCURSOR IS
SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE;
BEGIN
IF NOT EMPCURSOR%ISOPEN THEN
OPEN EMPCURSOR;
END IF;
LOOP
FETCH EMPCURSOR INTO V_FIRSTNAME,V_LASTNAME;
EXIT WHEN EMPCURSOR%NOTFOUND;
END LOOP;
IF EMPCURSOR%ISOPEN THEN
CLOSE EMPCURSOR;
END;
END PROCEDURE1;
تستطيع ايضا استخذام DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME)
, ، داخل الحلقة لعرض الإخراج. ولكن من أجل القيام بذلك ، تحتاج أولاً إلى تنفيذ الأمر server output on
نصائح أخرى
تحتاج إلى إعلان المتغيرات قبل أن تحاول ملءها:
CREATE OR REPLACE PROCEDURE PROCEDURE1
AS
FirstName EMPLOYEE.FIRSTNAME%TYPE;
LastName EMPLOYEE.LASTNAME%TYPE;
BEGIN
SELECT FIRSTNAME,
LASTNAME
INTO FirstName,LastName
FROM EMPLOYEE;
END PROCEDURE1;
يعد تدوين النوع ٪ اختصارًا لإعلان نوع البيانات الذي يطابق نوع بيانات العمود. إذا تغير نوع البيانات هذا ، فلن تحتاج إلى تحديث الإجراء.
تحتاج إلى إعلان المتغيرات.
CREATE OR REPLACE
PROCEDURE PROCEDURE1 AS
V_FIRSTNAME VARCHAR2(60);
V_LASTNAME VARCHAR2(60);
BEGIN
SELECT FIRSTNAME,LASTNAME
INTO V_FIRSTNAME ,V_LASTNAME
FROM EMPLOYEE;
END PROCEDURE1;
رداً على تعليقك ، يمكن أن تجلب عبارات SQL في كتلة PL/SQL سجل واحد فقط. إذا كنت بحاجة إلى جلب سجلات متعددة ، فستحتاج إلى تخزين السجلات في المؤشر ومعالجتها.
CREATE OR REPLACE
PROCEDURE PROCEDURE1 AS
CURSOR EMP_CUR IS
SELECT FIRSTNAME,LASTNAME
FROM EMPLOYEE;
EMP_CUR_REC EMP_CUR%ROWTYPE;
BEGIN
FOR EMP_CUR_REC IN EMP_CUR LOOP
-- do your processing
DBMS_OUTPUT.PUT_LINE('Employee first name is ' || EMP_CUR_REC.FIRSTNAME);
DBMS_OUTPUT.PUT_LINE('Employee last name is ' || EMP_CUR_REC.LASTNAME);
END LOOP;
END PROCEDURE1;
لشرح: EMP_CUR
يحمل بيان SQL ليتم تنفيذه. EMP_CUR_REC
يحمل السجلات التي سيتم جلبها بواسطة بيان SQL. %ROWTYPE
يشير إلى أن السجل سيكون من نفس نوع البيانات مثل الصف الذي يحتفظ بالبيانات
ال FOR LOOP
سوف تجلب كل سجل ، ويمكنك القيام بأي معالجة يجب القيام بها.
في رد على إجابة @sathya أعلاه kayak ، سأل "هل يمكنني الحصول على شيء مثل Select * من Tablename أو تحديد اسم FirstName ، LastName من Tablename ، مثلنا في SQL Server".
نعم ، يمكنك القيام بذلك ، ولكن ستحتاج إما إلى تضمين شرط حيث استخدام المؤشر. إذا قمت بتضمين شرط حيث يحد نتائجك إلى صف واحد يمكنك كتابة شيء مثل
CREATE OR REPLACE PROCEDURE PROCEDURE1
IS
rowEmployees EMPLOYEE%ROWTYPE;
BEGIN
SELECT *
INTO rowEmployees
FROM EMPLOYEE
WHERE EMPLOYEE_ID = 12345;
END PROCEDURE1;
من ناحية أخرى ، إذا لم يكن لديك فقرة حيث كنت ترغب في معالجة جميع الصفوف في الجدول ، أو لديك جملة لا تحد من نتائجك إلى صف واحد يمكنك استخدام المؤشر في النحو التالي:
CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
BEGIN
FOR rowEmployees IN (SELECT *
FROM EMPLOYEE
WHERE EMPLOYEE_ID IN (12345, 67890, 111213, 141516))
LOOP
<do something with rowEmployees here>
END LOOP;
END PROCEDURE1;
مشاركة واستمتع.