-2

私は3つのテーブルを持っています:

  • EMPLOYEE (ssn、給与)。
  • WORKS_ON (essn、pid、時間)。
  • プロジェクト (pid、pname)。

EMPLOYEE のデータ例:

insert into EMPLOYEE values('1011', 1000)
insert into EMPLOYEE values('1012', 1200).

WORKS_ONのサンプルデータ

insert into WORKS_ON values('1011',80, 60)
insert into WORKS_ON values('1012',90, 40).

PROJECTのサンプルデータ

insert into PROJECT values(80, A)
insert into PROJECT values(90, B).

ストアド プロシージャを作成する必要があり、勤務時間が 50 時間を超える場合は、給与を 10% に設定します。

これは私がやったことです.UPDATEに問題がありました(コード全体が間違っている可能性があります)。何度も試しましたが、まだ問題が発生しています.助けてください.

CREATE OR REPLACE PROCEDURE employee_details(p_ssn IN CHAR) AS
   v_ssn employee.ssn%TYPE;
   v_sal employee.salary%TYPE;
   w_hours works_on.hours%TYPE;
BEGIN
   SELECT ssn, salary, hours
   INTO v_ssn, v_sal, w_hours
   FROM employee NATURAL JOIN works_on
   WHERE ssn = p_ssn
   AND ssn = essn;
   DBMS_OUTPUT.PUT_LINE('Employee_ssn :' || v_ssn);
   DBMS_OUTPUT.PUT_LINE('Employee_sal :' || v_sal);
   DBMS_OUTPUT.PUT_LINE('Work_hours :' || w_hours);
   IF w_hours > 60.0 THEN
   v_sal := v_sal + (v_sal * .1);
   END IF;
   UPDATE employee
   SET salary = v_sal
   WHERE ssn = essn
   AND ssn = p_ssn;
   EXCEPTION 
   WHEN NO_DATA_FOUND THEN
   DBMS_OUTPUT.PUT_LINE('No data found.');
   WHEN TOO_MANY_ROWS THEN
   DBMS_OUTPUT.PUT_LINE('Many rows fetched.');
END;

エラー:
17/1 PL/SQL: SQL ステートメントは無視されました
19/13 PL/SQL: ORA-00904: "ESSN": 無効な識別子

私の期待される結果は

Employee_ssn : 1011
Employee_sal : 1100
Work_hours : 60

ありがとう!

4

2 に答える 2

0

あなたが書いた手順は、存在しないテーブルと列を使用しています(あなたが投稿したものによると)。

  • テーブルworks_onworks_hour
  • あなたが使用しessnた; それは何ですか?
  • サンプル データの不一致。SSN = 1011 の場合、101 に結合されることは期待できないため、ORA-01422 (使用したタグ) ( too_many_rows) は発生しませんが、no_data_found.

修正すべきだと思ったものを修正しようとしました。次に、プロシージャがコンパイルされます。

SQL> CREATE OR REPLACE PROCEDURE employee_details(
  2    p_ssn IN CHAR
  3  )AS
  4
  5    v_ssn    employee.ssn%TYPE;
  6    v_sal    employee.salary%TYPE;
  7    w_hours  works_hour.hours%TYPE;  -- works_hour, not works_on
  8  BEGIN
  9    SELECT ssn,
 10           salary,
 11           hours
 12    INTO
 13      v_ssn,
 14      v_sal,
 15      w_hours
 16    FROM employee
 17     JOIN works_hour on emp_ssn = ssn
 18    WHERE ssn = p_ssn;
 19    --AND ssn = v_ssn; -- essn;
 20
 21    dbms_output.put_line('Employee_ssn :' || v_ssn);
 22    dbms_output.put_line('Employee_sal :' || v_sal);
 23    dbms_output.put_line('Work_hours :' || w_hours);
 24    IF w_hours > 60.0 THEN
 25      v_sal := v_sal +(v_sal *.1);
 26    END IF;
 27
 28    UPDATE employee
 29    SET
 30      salary = v_sal
 31    WHERE ssn = v_ssn -- essn
 32          AND ssn = p_ssn;
 33
 34  EXCEPTION
 35    WHEN no_data_found THEN
 36      dbms_output.put_line('No data found.');
 37    WHEN too_many_rows THEN
 38      dbms_output.put_line('Many rows fetched.');
 39  END;
 40  /

Procedure created.

SQL>

今でも機能します:

SQL> set serveroutput on
SQL>
SQL> exec employee_details('1011');
Employee_ssn :1011
Employee_sal :1000
Work_hours :60

PL/SQL procedure successfully completed.

SQL> select * From employee;

SSN      SALARY
---- ----------
1011       1000
1012       1200

SQL>

でも、それがあなたの望みだったかどうかはわかりません。

于 2021-07-04T18:47:50.260 に答える