zoukankan      html  css  js  c++  java
  • Oracle数据库---存储过程、存储函数

    --创建存储过程
    CREATE OR REPLACE PROCEDURE first_proc
    IS
    BEGIN
    DBMS_OUTPUT.PUT_LINE('我是过程');
    DBMS_OUTPUT.PUT_LINE('Hello Everyone!');
    END;

    --创建函数
    CREATE OR REPLACE FUNCTION first_func
    RETURN VARCHAR2
    IS
    BEGIN
    DBMS_OUTPUT.put_line('我是函数');
    RETURN 'Hello Everyone!';
    END;


    --调用存储过程
    BEGIN
    first_proc;
    END;

    --调用存储函数
    BEGIN
    DBMS_OUTPUT.put_line(first_func);
    END;

    --1:创建输入参数的存储过程
    --根据员工号删除指定的员工信息
    CREATE OR REPLACE PROCEDURE proc1
    (v_empno IN empnew.empno%TYPE)
    IS
    BEGIN
    --根据员工号删除指定的员工信息
    DELETE FROM empnew WHERE empno = v_empno;
    --判断是否删除成功
    IF SQL%NOTFOUND THEN
    -- -20000~ -20999之间
    RAISE_APPLICATION_ERROR(-20008,'指定删除的员工不存在!');
    ELSE
    DBMS_OUTPUT.put_line('删除成功!');
    END IF;
    END;

    --2;创建带有输出参数的存储过程
    --求指定部门的平均工资和总人数
    CREATE OR REPLACE PROCEDURE proc2
    (v_deptno IN NUMBER, v_avgsal OUT NUMBER, v_cnt out NUMBER)
    IS
    BEGIN
    SELECT AVG(sal),COUNT(*)
    INTO v_avgsal, v_cnt
    FROM emp
    WHERE deptno = v_deptno;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.put_line('没有此部门!');
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(SQLERRM);
    END;

    --3:创建带有输入输出参数的存储过程
    --实现两个数的交换
    CREATE OR REPLACE PROCEDURE proc3
    (v_num1 IN OUT NUMBER, v_num2 IN OUT NUMBER)
    AS
    v_temp NUMBER := 0;
    BEGIN
    v_temp:= v_num1;
    v_num1:= v_num2;
    v_num2:= v_temp;
    END;

    --1:创建带有输入参数的存储函数
    --根据部门编号返回该部门的总工资
    CREATE OR REPLACE FUNCTION func1
    (v_deptno IN NUMBER)
    RETURN NUMBER
    IS
    v_sumsal NUMBER;
    BEGIN
    SELECT SUM(SAL) INTO v_sumsal FROM emp WHERE deptno = v_deptno;
    RETURN v_sumsal;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('没有此部门!');
    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    END;

    --2:创建带有输出参数的存储函数
    --根据员工号输出员工的姓名和员工的工资,并且返回员工的年收入
    CREATE OR REPLACE FUNCTION func2
    (v_empno IN emp.empno%TYPE, v_name OUT emp.ename%TYPE, v_sal OUT emp.sal%TYPE)
    RETURN NUMBER
    IS
    v_salsum NUMBER;
    BEGIN
    SELECT ename,sal,(sal+nvl(comm,0))*12
    INTO v_name,v_sal,v_salsum
    FROM emp
    WHERE empno = v_empno;
    RETURN v_salsum;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.put_line('没有此员工!');
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(SQLERRM);
    END;

    --3:创建带有输入输出参数的存储函数
    --求两个数的平方和,并输出两个数的平方

    CREATE OR REPLACE FUNCTION func3
    (n1 IN OUT NUMBER, n2 IN OUT NUMBER)
    RETURN NUMBER
    AS
    BEGIN
    n1 := n1*n1;
    n2 := n2*n2;
    RETURN n1+n2;
    END;

    --调用无参的存储过程
    begin
    first_proc;
    end;

    --调用带有输入参数的存储过程
    begin
    proc1(1234);
    end;

    --调用带有输出参数的存储过程
    DECLARE
    v_avgsalary NUMBER;
    v_count NUMBER;
    BEGIN
    PROC2(10,v_avgsalary,v_count);
    DBMS_OUTPUT.put_line('平均工资:'||v_avgsalary);
    DBMS_OUTPUT.put_line('总人数:'||v_count);
    END;

    --调用带有输入输出参数的存储过程
    DECLARE
    v_n1 NUMBER := 5;
    v_n2 NUMBER := 10;
    BEGIN
    PROC3(v_n1,v_n2);
    DBMS_OUTPUT.put_line('N1:'||v_n1);
    DBMS_OUTPUT.put_line('N2:'||v_n2);
    END;

    --删除存储过程
    DROP PROCEDURE proc1;

    --调用无参的函数
    BEGIN
    DBMS_OUTPUT.put_line(first_func);
    END;

    --调用带有输入参数的函数
    BEGIN
    DBMS_OUTPUT.put_line('部门的工资总额'||func1(&no));
    END;

    --调用带有输出参数的函数
    DECLARE
    v_name emp.ename%TYPE;
    v_sal emp.sal%TYPE;
    v_salsum NUMBER;
    BEGIN
    v_salsum := func2(&no,v_name,v_sal);
    DBMS_OUTPUT.put_line('姓名:'||v_name);
    DBMS_OUTPUT.put_line('工资:'||v_sal);
    DBMS_OUTPUT.put_line('年收入:'||v_salsum);
    END;

    --调用带有输入输出参数的函数
    DECLARE
    v_n1 number :=5;
    v_n2 number :=6;
    v_sum number;
    BEGIN
    v_sum := func3(v_n1,v_n2);
    DBMS_OUTPUT.put_line('N1的平方:'||v_n1);
    DBMS_OUTPUT.put_line('N2的平方:'||v_n2);
    DBMS_OUTPUT.put_line('平方和:'||v_sum);
    END;


    --删除存储函数
    DROP FUNCTION func1;

    --求部门的年收入
    CREATE OR REPLACE FUNCTION func4
    (v_deptno IN NUMBER DEFAULT 10,v_t IN NUMBER)
    RETURN NUMBER
    IS
    v_sumsal NUMBER;
    BEGIN
    SELECT SUM((sal+nvl(comm,0))*12)
    INTO v_sumsal
    FROM emp
    WHERE deptno = v_deptno;
    DBMS_OUTPUT.put_line('测试:'||v_t);
    RETURN v_sumsal;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.put_line('没有此部门');
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(SQLERRM);
    END;

    --调用
    declare
    v_totalsal number;
    begin
    v_totalsal := func4(v_t=>1);
    dbms_output.put_line(v_totalsal);
    end;

  • 相关阅读:
    css+ul+li方式 横向再纵向排列
    b表中有的塞给a表
    .net remoting的两种实现方式 cow
    Prism之Module cow
    2012项目总结 cow
    WCF学习笔记 cow
    也谈委托,事件和回调 cow
    理清apply(),call()的区别和关系 cow
    CLR via C#学习之线程栈,托管堆,值类型和引用类型 cow
    细说系列笔记 cow
  • 原文地址:https://www.cnblogs.com/xiaomifeng1010/p/11117382.html
Copyright © 2011-2022 走看看