Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kesalahan saat membuat badan paket Oracle

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah ada pragma PL/SQL yang mirip dengan DETERMINISTIC, tetapi untuk cakupan satu SQL SELECT?

  2. Bagaimana cara menggunakan Oracle dari .NET?

  3. Mengekspor CLOB ke file teks menggunakan Oracle SQL Developer

  4. Mendapatkan kesalahan ORA - 00907 pada hal berikut di ON UPDATE

  5. Apakah benar-benar lebih baik menggunakan tabel yang dinormalisasi?