寻找高级雇员的程序[已结束]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找高级雇员的程序[已结束]相关的知识,希望对你有一定的参考价值。
我尝试编写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中。
答案
我无法访问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>
另一答案
你必须声明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;
另一答案
你忘了申报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;
以上是关于寻找高级雇员的程序[已结束]的主要内容,如果未能解决你的问题,请参考以下文章
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段