zoukankan      html  css  js  c++  java
  • oracle对象之自定义函数

    函数主要做运算,查询,不能做DML操作的(存储过程是可以的!)

    函数用来执行复杂的计算,并返回计算的结果

     注:创建函数前需要给咱们的用户开放创建函数的权限(create procedure)  create procedure: 创建存储过程/创建函数都是这个权限

    语法结构:

    create or replace FUNCTION  funname   [(parameter,...)]

           RETURN datatype

    {IS | AS}

    ..定义变量的

    begin

     < function_body >

    end funname ;

    注意:

    创建一个PL/SQL函数,只返回计算的结果值,函数不能像存储过程那样,对数据库进行操作。

    只能使用in模式参数传入参数值

    在函数的声明中,必须包括一个带有数据类型的RETURN 子句,表示函数计算后的最终返回函数的结果类型。

    在PL/SQL块中至少包括一个有效的RETURN语句,以便返回函数的最终计算结果。

    函数调用:

    plsql块内调用 并赋值

    DECLARE
       c number(2);
    BEGIN
       c := totalCustomers();
       dbms_output.put_line('Total no. of Customers: ' || c);
    END;
    /

    sql窗口调用:
    select changeda('1') from dual;

    注意;
    oracle没有boolean的数据类型,但是plqsl里是有的如果要在SQL中使用,改为1,0或'T','F'或类似方法。BOOLEAN只能在PLSQL中使用

    案例1:

    CREATE OR REPLACE FUNCTION changeda (v_str VARCHAR2)
    RETURN VARCHAR2
    RESULT_CACHE
    AS
    v_return VARCHAR2 (500);
    BEGIN
    if(v_str = '1') then
    v_return := '是';
    elsif (v_str = '2') then
    v_return :='否';
    else
    v_return := null;
    end if;
    RETURN v_return;
    END changeda;

     java调用函数

      和java调用存储过程类似。

    --建立一个返回游标
    CREATE OR REPLACE PACKAGE PKG_PUB_UTILS IS
    --动态游标
    TYPE REFCURSOR IS REF CURSOR;
    END PKG_PUB_UTILS;

    stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");
    // stmt.registerOutParameter(1, java.sql.Types.FLOAT);
    // stmt.registerOutParameter(2, java.sql.Types.CHAR);
    stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
    stmt.setString(2, in_price);
    stmt.executeUpdate();

    // 取的结果集的方式一:
    rs = ((OracleCallableStatement) stmt).getCursor(1); //游标
    // 取的结果集的方式二:
    // rs = (ResultSet) stmt.getObject(1);

    while (rs.next()) {
    ric = rs.getString(1);
    price = rs.getString(2);
    updated = rs.getString(3);
    System.out.println("ric:" + ric + ";-- price:" + price + "; --"
    + updated + "; ");
    }

  • 相关阅读:
    动态代理,反射的用途及实现
    谈一谈web.xml中的context-param和init-param
    后端程序员需要了解的前端知识(持续更新中)
    angularJS要点记录,$location,$http等等
    HTTP1.0和HTTP2.0的区别,以及HTTP和HTTPS的区别
    浅谈Fork/Join框架
    ConcurrentHashMap 的工作原理及源码分析,如何统计所有的元素个数
    HTTP协议常见的状态码
    图解HTTP,状态码,TCP、UDP等网络协议相关总结(持续更新)
    jmeter(五)JDBC Request
  • 原文地址:https://www.cnblogs.com/spdboke/p/6872196.html
Copyright © 2011-2022 走看看