Grund Oracle Frage
-
30-09-2019 - |
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
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
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
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önnteCREATE 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.