10/38 PLS-00201: 'ID' must be declared
Sie wählen Daten in eine lokale Variable ID
aus das ist nicht deklariert. Wenn Sie eine lokale Variable deklarieren möchten, tun Sie dies im Deklarationsabschnitt zwischen AS
und der BEGIN
PROCEDURE create_emp(p_last_name IN employees.last_name%type,
p_first_name IN employees.first_name%type,
p_email IN employees.email%type,
p_hire_date IN employees.hire_date%type,
p_job_id IN employees.job_id%type)
AS
id integer;
BEGIN
SELECT emp_sequence.NEXTVAL INTO id FROM dual;
In diesem Fall sollten Sie die lokale Variable id
verwenden in Ihrem INSERT
-Anweisung, anstatt emp_sequence.nextval
aufzurufen direkt. Persönlich würde ich jedoch die lokale Variable loswerden, das anfängliche SELECT
loswerden , und machen Sie einfach emp_sequence.nextval
Rufen Sie Ihr INSERT
auf Aussage.
11/17 PL/SQL: ORA-00913: too many values
Unabhängig davon, wie Sie es tun, benötigen Sie jedoch die Anzahl der Spalten in Ihrem INSERT
um der Anzahl von VALUES
zu entsprechen Sie spezifizieren.
PROCEDURE create_emp(p_last_name IN employees.last_name%type,
p_first_name IN employees.first_name%type,
p_email IN employees.email%type,
p_hire_date IN employees.hire_date%type,
p_job_id IN employees.job_id%type)
AS
id integer;
BEGIN
SELECT emp_sequence.NEXTVAL INTO id FROM dual;
INSERT INTO employees(employee_id, last_name, first_name, email, hire_date, job_id)
VALUES (id, p_last_name, p_first_name, p_email, p_hire_date, p_job_id);
END create_emp;
Oder wenn Sie die Sequenz direkt aufrufen möchten
PROCEDURE create_emp(p_last_name IN employees.last_name%type,
p_first_name IN employees.first_name%type,
p_email IN employees.email%type,
p_hire_date IN employees.hire_date%type,
p_job_id IN employees.job_id%type)
AS
BEGIN
INSERT INTO employees(employee_id, last_name, first_name, email, hire_date, job_id)
VALUES ( emp_sequence.NEXTVAL, p_last_name, p_first_name, p_email, p_hire_date, p_job_id);
END create_emp;
Ebenso sollte für Ihren nächsten Fehler die Anzahl der Variablen, die Sie abrufen, mit der Anzahl der Spalten übereinstimmen, die Sie auswählen
51/5 PL/SQL: ORA-00947: insufficient values
In Ihrem read_emp wählen Sie 7 Dinge aus und versuchen, sie in 6 Variablen einzufügen. Angenommen, Sie möchten die employee_id
nicht zurückgeben , machen Sie sich nicht die Mühe, es auszuwählen.
PROCEDURE read_emp(p_employee_id IN employees.employee_id%type,
p_last_name OUT employees.last_name%type,
p_first_name OUT employees.first_name%type,
p_email OUT employees.email%type,
p_hire_date OUT employees.hire_date%type,
p_job_id OUT employees.job_id%type,
p_salary OUT employees.salary%type)
AS
BEGIN
SELECT last_name, first_name, email, hire_date, job_id, salary
INTO p_last_name, p_first_name, p_email, p_hire_date, p_job_id, p_salary
FROM EMPLOYEES
WHERE employee_id = p_employee_id;
END read_emp;
Während Sie einen read_emp
schreiben können Vorgehensweise wie dieser, wäre es im Allgemeinen sinnvoller, eine Funktion zu erstellen, die einen employees%rowtype
zurückgibt stattdessen aufzeichnen.
Ihre Ausnahmeklauseln sollten entfernt werden. Bestenfalls verwerfen sie den Fehlerstapel, der einer Person mitteilen würde, was wo fehlgeschlagen ist. Im schlimmsten Fall verbergen sie die Fehler (Sie sollten niemals davon ausgehen, dass irgendjemand jemals etwas sehen wird, was Sie in dbms_output
schreiben ) und bewirkt, dass der aufrufende Code glaubt, dass eine Operation erfolgreich war, obwohl dies nicht der Fall war.