سؤال

أنا جديد على أوراكل. عندما أقوم بإنشاء إجراء مخزن باستخدام:

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; 

مشاركة واستمتع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top