程序寻找高级员工

时间:2018-12-20 06:58:52

标签: sql oracle plsql oracle11g procedure

我试图编写一个PL / SQL程序来查找员工是否已经工作了至少10年。

create or REPLACE PROCEDURE IsSenEmp IS
    jdate date;
    years NUMBER;
BEGIN
    SELECT HIRE_DATE into jdate
    FROM EMPLOYEES
    WHERE EMPLOYEE_ID = 100;
    years := "MONTHS_BETWEEN"(SYSDATE, jdate)/12;
    if years >= 10 THEN
        dbms_output.put_line(first_name||' has worked for more than 10 years.');
    ELSE
        dbms_output.put_line(first_name||' has NOT worked for 10 years.');
    end if;
END;

但是我得到

  

创建过程出现编译错误。

在SQL Plus中。

3 个答案:

答案 0 :(得分:3)

您必须声明 first_name局部变量,如下所示:

CREATE OR REPLACE PROCEDURE IsSenEmp IS
    -- When declaring local variables let's use table fields' types: %type
    jdate EMPLOYEES.HIRE_DATE%TYPE;
    years NUMBER;
    first_name EMPLOYEES.FIRST_NAME%TYPE; -- <- first_name must be declared
BEGIN
    SELECT HIRE_DATE,
           FIRST_NAME -- reading FIRST_NAME field ...
      INTO jdate,
           first_name -- ... into first_name local variable
      FROM EMPLOYEES
     WHERE EMPLOYEE_ID = 100;

    years := "MONTHS_BETWEEN"(SYSDATE, jdate) / 12;

    if years >= 10 THEN
        dbms_output.put_line(first_name || ' has worked for more than 10 years.');
    ELSE
        dbms_output.put_line(first_name || ' has NOT worked for 10 years.');
    END IF;
END;

答案 1 :(得分:2)

您忘记声明名字了

create or REPLACE PROCEDURE IsSenEmp IS
    jdate date;
    years NUMBER;
    first_name VARCHAR2(100);
BEGIN
    SELECT HIRE_DATE into jdate
    FROM EMPLOYEES
    WHERE EMPLOYEE_ID = 100;
    SELECT first_name into first_name
    FROM EMPLOYEES
    WHERE EMPLOYEE_ID = 100;
    years := "MONTHS_BETWEEN"(SYSDATE, jdate)/12;
    if years >= 10 THEN
        dbms_output.put_line(first_name||' has worked for more than 10 years.');
    ELSE
        dbms_output.put_line(first_name||' has NOT worked for 10 years.');
    end if;
END;

答案 2 :(得分:2)

我无权访问HR模式,因此我创建了自己的样本表。在这里,您去了:

SQL> CREATE TABLE employees
  2  (
  3     employee_id   NUMBER,
  4     hire_date     DATE,
  5     first_name    VARCHAR2 (20)
  6  );

Table created.

SQL> INSERT INTO employees
  2       VALUES (100, DATE '2017-10-25', 'Littlefoot');

1 row created.

SQL> CREATE OR REPLACE PROCEDURE IsSenEmp
  2  IS
  3     jdate          DATE;
  4     l_first_name   employees.first_name%TYPE;
  5     years          NUMBER;
  6  BEGIN
  7     SELECT HIRE_DATE, first_name
  8       INTO jdate, l_first_name
  9       FROM EMPLOYEES
 10      WHERE EMPLOYEE_ID = 100;
 11
 12     years := MONTHS_BETWEEN (SYSDATE, jdate) / 12;
 13
 14     IF years >= 10
 15     THEN
 16        DBMS_OUTPUT.put_line (
 17           l_first_name || ' has worked for more than 10 years.');
 18     ELSE
 19        DBMS_OUTPUT.put_line (l_first_name || ' has NOT worked for 10 years.');
 20     END IF;
 21  END;
 22  /

Procedure created.

SQL> EXEC issenemp;
Littlefoot has NOT worked for 10 years.

PL/SQL procedure successfully completed.

SQL>