存储过程是将编译好的PLSQL代码片段存储在数据库中:
1.提高了业务逻辑的执行效率 2.将复杂的逻辑的逻辑封装成了一个过程
语法:create or repalce procedure 过程名称
as
声明部分
begin
- -业务逻辑
end;
打印语句:dbms_output.put_line( ) 字符串的连接用‘||’
输入参数用in 输出参数用out
---------------------------------------------------------------------------------------------------
存储函数
格式为:
create or repalce function 函数名(参数...)
return 数据类型
as
begin
end;
存储函数与存储过程的区别:
1.函数一定要有返回值:在开头要声明返回值的类型
2.封装好的函数可以在SQL语句中使用,存储过程不可以
3.函数存在的意义是给过程调用。在工作中调用的通常是过程
4.函数和过程本质上没有什么区别
存储过程在Java中的调用:
例如:在Oracle数据库中创建一个pro_query查询过程,根据工作号查询员工的姓名、工作、工资
create or repalce procedure pro_query(eno in number,name out varchar,qjob out varchar,qsal out varchar)
begin
select ename,job,sal into name,job,sal from emp where empno=eno;
end;
java中 调用过程:
加载驱动 连接数据库 通过数据连接.prepareCall(sql)创建CallableStatement对象.
包装数入参数call.set()
注册输出参数registerOutParameter( , OracleTypes. );
执行call.execute()
获取数据
call.get()
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.internal.OracleTypes;
/*
* 存储过程的调用
* --创建一个存储过程,通过输入的员工号数出,员工姓名,工作还有工资
* */
public class practice {
public static void main(String[] args) {
Connection conn=null;
CallableStatement call=null;
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//连接数据库
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott","123456");
//创建callablestatement
String sql="call pro_query(?,?,?,?)";
call=conn.prepareCall(sql);
//封装参数
call.setInt(1, 7499);
//注册输出参数
call.registerOutParameter(2, OracleTypes.VARCHAR);
call.registerOutParameter(3,OracleTypes.VARCHAR);
call.registerOutParameter(4, OracleTypes.NUMBER);
//执行,此处的返回的类型为boolean类型,可根据此处判断是否执行成功
call.execute();
String name=call.getString(2);
String job=call.getString(3);
int sal=call.getInt(4);
System.out.println("ename="+name);
System.out.println("job="+job);
System.out.println("sal="+sal);
} catch (ClassNotFoundException e) {
System.out.println("加载驱动失败!");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("连接数据库失败!");
e.printStackTrace();
}
}
}