寻找高级雇员的程序[已结束]

问题描述 投票:0回答:3

我尝试编写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中。

sql oracle plsql oracle11g procedure
3个回答
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>

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;

2
投票

你忘了申报first_name

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;
© www.soinside.com 2019 - 2024. All rights reserved.