zoukankan      html  css  js  c++  java
  • Oracle基础学习(二) 存储过程和函数

    --创建函数语法
    create [or replace] function [schema.]function_name
    (函数参数列表) --参数有IN、OUT、IN OUT三种类型;IN代表需要输入的参数,OUT代表要返回的参数,IN OUT代表即是输入参数也是返回参数。
    return datetype--返回类型               
    -- out参数:查询某个员工姓名、月薪和职位 -- 原则: 如果只有一个返回值,用存储函数;否则,就用存储过程。
    [is | as ]---任选一个,后面跟pLSQL代码块 [declare]--有参数时使用关键字 begin --执行的SQL end; --实例

    1.

    根据输入参数的部门内码获得部门名称

    CREATE OR REPLACE FUNCTION f_get_name(i_empno IN VARCHAR2)
    RETURN VARCHAR2 IS
    v_emp_name emp.ename%TYPE;
    BEGIN
    SELECT t.ename INTO v_emp_name
    FROM emp t WHERE t.empno = i_empno;
    RETURN(v_emp_name);
    EXCEPTION
    WHEN no_data_found THEN
    dbms_output.put_line('你需要的数据不存在');
    WHEN OTHERS THEN
    dbms_output.put_line('发生其他错误');
    END f_get_name;

    2.
    create
    or replace function avg_pric(v_total in number(10.2), v_num In OUT number(10,2)) return number(10,2) as v_pric number(10,2); begin v_pric:=v_total/v_num; return v_pric; end; --查看函数 select * from User_Procedures;--用户拥有的触发器、存储过程、函数查询表 select * from User_Source;--查询用户拥有触发器、存储过程、函数的源码。 select * from dba_Procedures;--系统表 select * from dba_Source;--系统表

    3.--查询某个员工的年收入
    create or replace function queryemp_income(eno in number)
    return number
    as 
        --定义变量接收薪水和奖金
        p_sal emp.sal%type;
        p_comm emp.comm%type;
    begin
      select sal,comm into p_sal,p_comm from emp where empno=eno;
      --nvl为遇空函数,如果p_comm为空则返回0
      return nvl(p_comm,0)+p_sal*12;
    end;
    
    
    

     存储过程

    CREATE [OR REPLACE] PROCEDURE procedure_name
        [ (parameter [,parameter]) ]
    IS
        [declaration_section]
    BEGIN
        executable_section
    [EXCEPTION
        exception_section]
    END [procedure_name];
    复制代码

    调用存储过程方式一,exec 存储过程名

    调用存储过程方式二,PLSQL程序

    1.无参数存储过程
    create or replace procedure pro_no_par is begin update employees set salary=salary+100 where employee_id=100; commit; dbms_output.put_line('工资已经调整!!'); end pro_no_par; --执行,使用execute execute pro_no_par;

    2.in传入参数存储过程

    create or replace procedure pro_no_par
    is

      begin
      update employees set salary=salary+100 where employee_id=100;
      commit;
      dbms_output.put_line('工资已经调整!!');
      end pro_no_par;
      --执行,使用execute
      execute pro_no_par;

     3. out参数 

      declare
      ex_var_1 number;
      ex_var_2 employees.first_name%type;
      ex_var_3 employees.phone_number%type;
      begin
       ex_var_1:=102;
      pro_out_par(ex_var_1,ex_var_2,ex_var_3);
      dbms_output.put_line('员工号为'||ex_var_1||'的员工姓名是;'||ex_var_2||',联系电话是:'||ex_var_3);
      end;

    其中参数IN表示输入参数,是参数的默认模式。

    OUT表示返回值参数,类型可以使用任意Oracle中的合法类型

      

    -- out参数:查询某个员工姓名、月薪和职位
    -- 原则: 如果只有一个返回值,用存储函数;否则,就用存储过程。
    create or replace procedure queryempinfor(eno in number,pename out varchar2,
      psal out number,pjob out varchar2)
    as 
    begin
       -- 得到该员工的姓名、月薪和职位
        select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
    end;
    /
    --将人员表中经理职位并且年薪大于7万的人员信息插入到MANAGER表中,输出参数是插入的条数
    
    create or replace procedure p_manager_update(o_ename_num out number) is
    begin
    select to_number(count(1)) into o_ename_num
    from emp e
    where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000
    and e.job='MANAGER';
    insert into MANAGER(INCODE,ENAME,CREATE_DATE)
    select deptno_seq.nextval,e.ename,sysdate
    from emp e
    where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000
    and e.job='MANAGER'; 
    commit;
    end p_manager_update;
    
    --在COMMONAD WINDOWS里执行
    
    exec p_manager_update;
     
    --显示cursor的处理
    declare 
    ---声明cursor,创建和命名一个sql工作区
    cursor cursor_name is 
        select real_name from account_hcz;
        v_realname varchar2(20);
    begin
        open cursor_name;---打开cursor,执行sql语句产生的结果集
        fetch cursor_name into v_realname;--提取cursor,提取结果集中的记录
        dbms_output.put_line(v_realname);
        close cursor_name;--关闭cursor
    end;

     

     
  • 相关阅读:
    Linux xargs 命令
    Shell 流程控制
    springSecurity---AuthenticationProvider解析
    nginx unknown directive "stream"
    Linux清空文件内容
    解决RabbitMQ报错 Error: unable to connect to node rabbit@localhost:
    mysql bit类型 使用Mysql命令行查询的时候无法看到其值
    今日进度
    每周总结
    今日进度
  • 原文地址:https://www.cnblogs.com/jeffjoy/p/9209189.html
Copyright © 2011-2022 走看看