函数主要做运算,查询,不能做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 + "; ");
}