函数和过程
--=================================================================== --创建函数get_date,返回一个固定格式(yyyy-mm-dd)的当前日期时间字符串 --=================================================================== create or replace function get_date return varchar2 is v_date varchar2(50); begin v_date := to_char(sysdate,'yyyy-mm-dd'); return v_date; end; --测试 begin dbms_output.put_line(get_date); end; --======================================================= /* 创建函数get_name,传入一个员工编号,返回此员工的姓和名 例如Steven.King,如果员工不存在,返回“查无此人” */ --======================================================= create or replace function get_name(p_empid number) return varchar2 is v_name varchar2(100); begin select first_name||'.'||last_name into v_name from employees where employee_id=p_empid; return v_name; exception when no_data_found then return '查无此人'; end; --测试 declare v_name varchar2(100); begin v_name := get_name(100); dbms_output.put_line(v_name); end; --===================================================== --创建函数get_names,传入一个部门编号,返回这个部门所有员工的last-name --形成一个字符串,名字用逗号格开,例如tom,jack,rose --===================================================== create or replace function get_names (p_deptid employees.department_id%type) return varchar2 is v_names varchar2(4000); cursor c_names is select last_name from employees where department_id=p_deptid; begin for e in c_names loop v_names := v_names || e.last_name || ','; end loop; return trim(',' from v_names); end; --测试 begin dbms_output.put_line(get_names(90)); end; --============================================================ --创建函数add_salary,传入员工编号,金额,给某员工加工资 --返回加完工资,这个员工现在的工资是多少? --============================================================ create or replace function add_salary (p_empid number,p_money number) return number is v_salary number; begin update employees set salary=salary+p_money where employee_id=p_empid; select salary into v_salary from employees where employee_id=p_empid; commit; return v_salary; end; --测试 begin dbms_output.put_line(add_salary(100,2)); end; --=============================================================== --创建函数get_empcount,传入一个员工编号,返回员工的手下个数 --=============================================================== create or replace function get_empcount(p_empid number) return number is v_count number := 0;--总人数 cursor c_emp is select * from employees where manager_id=p_empid; begin for e in c_emp loop v_count := v_count + 1 + get_empcount(e.employee_id); end loop; return v_count; end; --测试 declare v_count number; begin v_count := get_empcount(101); dbms_output.put_line(v_count); end; --============================================================= --创建函数get_result,传入两个参数,返回相加结果和相减结果 --============================================================= create or replace function get_result (a number,b number,result2 out number,result3 out number) return number is v_add number; begin v_add := a + b; result2 := a - b; result3 := a * b; return v_add; end; --测试 declare v_result2 number; v_result3 number; begin dbms_output.put_line(get_result(5,3,v_result2,v_result3)); dbms_output.put_line(v_result2); dbms_output.put_line(v_result3); end; --===================================================================== --创建函数get_result,传入两个参数,返回相加结果和相减结果和相乘结果 --===================================================================== create or replace function get_result (a in out number,b in out number) return number is v_add number; v_a number := a; v_b number := b; begin v_add := v_a + v_b; a := v_a - v_b; b := v_a * v_b; return v_add; end; --测试 declare v_result1 number := 5; v_result2 number := 3; begin dbms_output.put_line(get_result(v_result1,v_result2)); dbms_output.put_line(v_result1); dbms_output.put_line(v_result2); end; --===================================================================== --创建函数get_deptinfo,传入部门编号,返回人数,工资总额,人均工资 --===================================================================== create or replace function get_deptinfo (p_deptid number default 90,p_sum out number,p_avg out number) return number is v_count number; begin select count(*),sum(salary),avg(salary) into v_count,p_sum,p_avg from employees where department_id=p_deptid; return v_count; end; --测试 declare v_sum number; v_avg number; begin dbms_output.put_line(get_deptinfo(50,v_sum,v_avg)); dbms_output.put_line(v_sum||','||v_avg); end; --测试2 declare v_sum number; v_avg number; begin dbms_output.put_line (get_deptinfo(p_sum=>v_sum,p_deptid=>50,p_avg=>v_avg)); dbms_output.put_line(v_sum||','||v_avg); end;