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 + "; ");
}

 

posted on 2017-05-18 10:47  好好学习,天天睡觉  阅读(781)  评论(0编辑  收藏  举报