1. CREATE OR REPLACE PACKAGE emp_actions 
  2. AS                                                    -- package specification 
  3.    PROCEDURE hire_employee (employee_id       NUMBER, 
  4.                             last_name         VARCHAR2, 
  5.                             first_name        VARCHAR2, 
  6.                             email             VARCHAR2, 
  7.                             phone_number      VARCHAR2, 
  8.                             hire_date         DATE, 
  9.                             job_id            VARCHAR2, 
  10.                             salary            NUMBER, 
  11.                             commission_pct    NUMBER, 
  12.                             manager_id        NUMBER, 
  13.                             department_id     NUMBER); 
  14.  
  15.    PROCEDURE fire_employee (emp_id NUMBER); 
  16.  
  17.    FUNCTION num_above_salary (emp_id NUMBER) 
  18.       RETURN NUMBER; 
  19. END emp_actions; 
  20.  
  21. /* Formatted on 2012-07-27 15:24:06 (QP5 v5.114.809.3010) */ 
  22. CREATE OR REPLACE PACKAGE BODY emp_actions 
  23. AS                                                             -- package body 
  24.    -- code for procedure hire_employee 
  25.    PROCEDURE hire_employee (employee_id       NUMBER, 
  26.                             last_name         VARCHAR2, 
  27.                             first_name        VARCHAR2, 
  28.                             email             VARCHAR2, 
  29.                             phone_number      VARCHAR2, 
  30.                             hire_date         DATE, 
  31.                             job_id            VARCHAR2, 
  32.                             salary            NUMBER, 
  33.                             commission_pct    NUMBER, 
  34.                             manager_id        NUMBER, 
  35.                             department_id     NUMBER) 
  36.    IS 
  37.    BEGIN 
  38.       INSERT INTO employees 
  39.         VALUES   (employee_id, 
  40.                   last_name, 
  41.                   first_name, 
  42.                   email, 
  43.                   phone_number, 
  44.                   hire_date, 
  45.                   job_id, 
  46.                   salary, 
  47.                   commission_pct, 
  48.                   manager_id, 
  49.                   department_id); 
  50.    END hire_employee; 
  51.  
  52.    -- code for procedure fire_employee 
  53.    PROCEDURE fire_employee (emp_id NUMBER) 
  54.    IS 
  55.    BEGIN 
  56.       DELETE FROM   employees 
  57.             WHERE   employee_id = emp_id
  58.    END fire_employee; 
  59.  
  60.    -- code for function num_above salary 
  61.    FUNCTION num_above_salary (emp_id NUMBER) 
  62.       RETURN NUMBER 
  63.    IS 
  64.       emp_sal     NUMBER (8, 2); 
  65.       num_count   NUMBER; 
  66.    BEGIN 
  67.       SELECT   salary 
  68.         INTO   emp_sal 
  69.         FROM   employees 
  70.        WHERE   employee_id = emp_id
  71.  
  72.       SELECT   COUNT ( * ) 
  73.         INTO   num_count 
  74.         FROM   employees 
  75.        WHERE   salary > emp_sal; 
  76.  
  77.       RETURN num_count; 
  78.    END num_above_salary; 
  79. END emp_actions; 

执行下面语句报错

  1. CALL emp_actions.hire_employee(300, 'Belden', 'Enrique', 'EBELDEN', 
  2. '555.111.2222', '30-AUG-04', 'AC_MGR', 9000, .1, 101, 110); 

ORA-01843 not a valid month

解决:

当我们在一个中文环境的客户端使用如下sql语句,数据库会报告一个ORA-01843的错误,这是因为客户端是中文环境,格式mon就不能用英文的月份写法,必须用中文的“六月”如果不想修改sql语句运行的话,就需要在执行该语句之前,使用alter session 命令将nls_date_language修改为american,如下:

  1. alter session set nls_date_language='american'     --以英语显示日期