我试图编写一个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中。
答案 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>