10/38 PLS-00201: 'ID' must be declared
Anda memilih data ke dalam variabel lokal ID
yang belum diumumkan. Jika Anda ingin mendeklarasikan variabel lokal, lakukan di bagian deklarasi antara AS
dan 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;
Jika Anda akan melakukannya, Anda ingin menggunakan variabel lokal id
di INSERT
. Anda pernyataan daripada memanggil emp_sequence.nextval
secara langsung. Namun, secara pribadi, saya akan menyingkirkan variabel lokal, menyingkirkan SELECT
. awal , dan buat saja emp_sequence.nextval
panggil INSERT
. Anda penyataan.
11/17 PL/SQL: ORA-00913: too many values
Terlepas dari bagaimana Anda melakukannya, Anda memerlukan jumlah kolom di INSERT
Anda untuk mencocokkan jumlah VALUES
Anda tentukan.
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;
Atau jika Anda ingin memanggil urutan secara langsung
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;
Demikian pula, untuk kesalahan berikutnya, jumlah variabel yang Anda ambil harus sesuai dengan jumlah kolom yang Anda pilih
51/5 PL/SQL: ORA-00947: insufficient values
Di read_emp Anda, Anda memilih 7 hal dan mencoba memasukkannya ke dalam 6 variabel. Dengan asumsi bahwa Anda tidak ingin mengembalikan employee_id
, jangan repot-repot memilihnya.
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;
Meskipun Anda dapat menulis read_emp
prosedur seperti ini, biasanya akan lebih masuk akal untuk membuat fungsi yang mengembalikan employees%rowtype
merekam sebagai gantinya.
Klausa pengecualian Anda harus dihapus. Paling-paling, mereka membuang tumpukan kesalahan yang akan memberi tahu seseorang apa yang gagal dan di mana. Paling buruk, mereka menyembunyikan kesalahan (Anda tidak boleh berasumsi bahwa siapa pun akan pernah melihat apa pun yang Anda tulis ke dbms_output
) dan menyebabkan kode panggilan percaya bahwa beberapa operasi berhasil padahal tidak.