sql >> データベース >  >> RDS >> Oracle

Oracleパッケージ本体の作成中にエラーが発生しました

    10/38    PLS-00201: 'ID' must be declared
    

    ローカル変数IDにデータを選択しています それは宣言されていません。ローカル変数を宣言する場合は、ASの間の宣言セクションで宣言します。 および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;
    

    これを行う場合は、ローカル変数idを使用することをお勧めします INSERTemp_sequence.nextvalを呼び出すのではなくステートメント 直接。ただし、個人的には、ローカル変数を削除し、最初のSELECTを削除します。 、emp_sequence.nextvalを作成するだけです INSERTを呼び出します 声明。

    11/17    PL/SQL: ORA-00913: too many values
    

    ただし、その方法に関係なく、INSERTの列数が必要になります。 VALUESの数と一致する 指定します。

       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;
    

    または、シーケンスを直接呼び出したい場合

       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;
    

    同様に、次のエラーの場合、フェッチする変数の数は、選択している列の数と一致する必要があります

    51/5     PL/SQL: ORA-00947: insufficient values
    

    read_empでは、7つのものを選択し、それらを6つの変数に入れようとしています。 employee_idを返したくないと仮定します 、わざわざ選択しないでください。

       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;
    

    read_empを書くことはできますが このような手順では、通常、employees%rowtypeを返す関数を作成する方が理にかなっています。 代わりに記録してください。

    例外条項を削除する必要があります。せいぜい、何がどこで失敗したかを人に伝えるエラースタックを破棄しているだけです。最悪の場合、彼らはエラーを隠しています(dbms_outputに書き込んだものが誰かに見られるとは決して思わないでください。 )そして、呼び出し元のコードに、成功しなかったときに何らかの操作が成功したと信じ込ませる。




    1. python odo sql AssertionError:datashapeはレコード型である必要があり、0を取得しました* {...}

    2. DundasBIでのQuickBooksデータの分析

    3. ExecuteReaderには、開いていて利用可能な接続が必要です。接続の現在の状態は接続中です

    4. JavaとPostgresの列挙型を連携させて更新するにはどうすればよいですか?