Frage

Ich bin neu in Oracle. Wenn ich eine gespeicherte Prozedur:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

i die folgenden Fehlermeldungen erhalten:

  

PL / SQL-Anweisung Ignoriert    Identifier VORNAME muss deklariert werden    ORA-00904 Ungültige Kennung

War es hilfreich?

Lösung


Ich denke, die „AS“ Schlüsselwort wird nicht funktionieren. Wenn es nicht funktioniert, dann verwenden „IS“.
Rest sind fein und sehr gute Tipps.

Wenn Sie Hilfe in Bezug auf PL / SQL benötigen, dann können Sie unter diesem Link anschauen. Es ist sehr einfach und leicht zu verstehen;
http://plsql-tutorial.com/

Dies ist meine Lösung für die Fehler, die Sie bekommen;

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;

Sie können auch DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME) verwenden, innerhalb der Schleife die Ausgabe anzuzeigen. aber um das zu tun, müssen Sie zunächst den Befehl server output on

auszuführen

Andere Tipps

Sie müssen Variablen deklarieren, bevor Sie versuchen, sie zu füllen:

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;

Die% TYPE-Notation ist eine Abkürzung für Datentypdeklaration, die den Spaltendatentyp übereinstimmt. Wenn dieser Datentyp jemals ändert, brauchen Sie nicht, das Verfahren zu aktualisieren.

Sie müssen die Variablen deklarieren.

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;

In Antwort auf Ihren Kommentar, SQL-Anweisungen in PL / SQL-Block können nur 1 Datensatz holen. Wenn Sie mehrere Datensätze holen müssen, müssen Sie die Datensätze in einem Cursor speichern und verarbeiten.

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;

Zur Erklärung:    EMP_CUR hält die SQL-Anweisung ausgeführt werden.    EMP_CUR_REC hält die Datensätze, die von der SQL-Anweisung abgerufen werden.     %ROWTYPE zeigt an, dass die Aufzeichnung des gleichen Datentypen wie die Reihe sein wird, die die Daten

hält

Die FOR LOOP wird jeden Datensatz holen, und Sie können tun, was Verarbeitung, dass getan werden muss.

In einer Antwort auf @ Sathya Antwort über @kayak gefragt: „Kann ich so etwas wie Select * von Tablenamen oder wählen Sie Vornamen, Nachnamen von Tabellennamen, wie wir in SQL Server haben“.

Ja, Sie können das tun, aber Sie werden entweder müssen umfassen eine WHERE-Klausel oder einen Cursor verwenden. Wenn Sie eine WHERE-Klausel, die Ergebnisse zu einer einzigen Reihe begrenzt Sie so etwas wie

schreiben könnte
CREATE OR REPLACE PROCEDURE PROCEDURE1
IS
  rowEmployees EMPLOYEE%ROWTYPE;
BEGIN
  SELECT *
    INTO rowEmployees
    FROM EMPLOYEE
    WHERE EMPLOYEE_ID = 12345;
END PROCEDURE1; 

Auf der anderen Seite, wenn Sie entweder nicht über eine WHERE-Klausel, weil Sie alle Zeilen in der Tabelle bearbeiten möchten, oder haben Sie eine WHERE-Klausel, die Ergebnisse auf eine einzelne Zeile nicht beschränken Sie verwenden könnte Cursor auf die folgende Weise:

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; 

Teile und genießen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top