美文网首页
新手编写存储过程入门

新手编写存储过程入门

作者: 离人在梦中_ef3c | 来源:发表于2019-03-15 10:56 被阅读0次

    存储过程的 概念:

    存储过程:就是一块PLSQL语句包装起来,起个名称

    语法上:相当于plsql语句戴个帽子。

    相对而言:单纯plsql可以认为是匿名程序。

    存储作用:

    1,在开发程序中,为了一个特定的业务功能,会向数据库进行多次连接关闭(连接和关闭是很耗费资源)。这种就需要对数据库进行多次I/O读写,性能比较低。如果把这些业务放到PLSQL中,在应用程序中只需要调用PLSQL就可以做到连接关闭一次数据库就可以实现我们的业务,可以大大提高效率.

    2, ORACLE官方给的建议:能够让数据库操作的不要放在程序中。在数据库中实现基本上不会出现错误,在程序中操作可以会存在错误.(如果在数据库中操作数据,可以有一定的日志恢复等功能.)

    提示:

    l plsql是存储过程的基础。

    l java是不能直接调用plsql的,但可以通过存储过程这些对象来调用。

    存储过程的语法:

    create or replace PROCEDURE 过程名(参数名) AS/IS plsql子程序体

    根据参数的类型,我们将其分为3类讲解:

    l不带参数的

    l带输入参数的

    l带输入输出参数的。

    <1>无参存储:

    创建存储:建议使用PROCEDURE这个窗口

    create or replace procedure p_hello IS

    begin 

     dbms_output.put('b'); --写入buffer但不输出

    dbms_output.new_line; --回车(换行),输出                             

     dbms_output.put_line('hello world!'); --输出并换行

    end p_hello

    测试存储:

    调用方法:

    如何调用执行,两种方法:

    l一种是是用exec命令来调用—用来测试存储

    exec过程名

    l一种是用其他的程序(plsql和java)来调用

    l 程序调用 

    BEGIN

      sayhelloworld;

      sayhelloworld;

      sayhelloworld;

    END;

    带书输入参数IN

    示例

    查询并打印某个员工(如7839号员工)的姓名和薪水--存储过程:要求,调用的时候传入员工编号,自动控制台打印:

    create or replace procedure p_queryempsal(i_empno IN emp.empno%TYPE)

    IS

    --声明变量

    v_ename emp.empname%TYPE;

    v_sal emp.empsal%TYPE;

    select empname,empsal into v_ename,v_sal from emp where empno=i_empno;

    dbms_output.put_line('姓名:'||v_ename||',薪水:'||v_sal);

    end p_queryempsal;

    --命令调用

    exec p_queryempsal(7878);

    --程序调用

    declare

    i_empno emp.empno%TYPE:=8989;

    BEGIN

    p_queryempsal(i_empno );

    END;

     带输入参数IN和输出结果OUT-----主要是其他程序调用

     示例:

    ----输入员工号查询某个员工(7839号(老大)员工)信息,要求,将薪水作为返回值输出,给调用的程序使用。

    CREATE OR REPLACE PROCEDURE p_queryempsal_out( i_empno IN emp.empno%TYPE,o_sal OUT emp.sal%TYPE)

    AS

    BEGIN

    --赋值:将薪水的值赋给输出的参数o_sal

      SELECT sal INTO o_sal FROM emp WHERE empno=i_empno;  

    END;

    调用:

    DECLARE

    --输入参数值

      v_empno emp.empno%TYPE:=7839;

    --声明一个变量来接收输出参数

      v_sal emp.sal%TYPE;

    BEGIN

    p_queryempsal_out(v_empno,v_sal);--第二个参数是输出的参数,必须有变量来接收!!

    --当上面的语句执行之后,v_sal就有值了。

    dbms_output.put_line('员工编号为:'||v_empno||'的薪资为:'||v_sal);

    END;

    java程序如何调用存储过程:

    //获取连接

    Connection conn = JDBCUtils.getConnection();

    String sql="{call p_queryempsal_out(?,?)}";//转义sql

    CallableStatement call = conn.prepareCall(sql);

    //1.输入参数

    call.setInt(1, 7839);//索引位置

    call.registerOutParameter(2, OracleTypes.DOUBLE);//第一个参数是占位符,第二个参数数据类型

    //执行存储

    call.execute();//执行的时候,会自动将参数传入数据库,将输出参数返回的数据,封装会call对象中。

    //获取输出参数的值

    doublesal = call.getDouble(2);

    System.out.println("薪资是:"+sal);

    //释放资源

    JDBCUtils.release(conn, call, null);

     结果如下:

    相关文章

      网友评论

          本文标题:新手编写存储过程入门

          本文链接:https://www.haomeiwen.com/subject/ecclmqtx.html