oracle学习笔记之存储过程与存储函数

存储过程与存储函数说明:存储函数有返回值!存储过程没有返回值!

指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。

什么时候用存储过程/存储函数

原则:如果只有一个返回值,用存储函数;否则,就用存储过程。

1.创建存储过程

用CREATE PROCEDURE命令建立存储过程。语法如下:

create [or replace] PROCEDURE 过程名[(参数列表)]

AS

    变量声明

PLSQL子程序体;

1)存储过程入门:

create or replace
procedure sayHello
as
begin
  dbms_output.put_line('hello world!');
end;

cmd命令行执行程序:

2)给员工涨工资

create or replace
procedure addSal(eno in number)
as
begin
  update emp2 set sal=sal*1.1 where empno=eno;
  dbms_output.put_line('涨工资完毕');
end;

3)带有输出结果的存储过程

create or replace
procedure queryEmpSal (eno in number,pname out VARCHAR2,psal out number)
as
begin
  select ename ,sal into pname,psal from emp2 where empno=eno;
end;

测试上述代码:

我们通过“从数据库Scott断开连接”这句话 可以判断数据库已经正常关闭-->因此数据库已经帮我们自动提交了事务!

2.创建存储函数

函数(Function)为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型等。

语法如下:

CREATE[OR REPLACE] FUNCTION 函数名(参数列表)

RETURN  函数值类型

AS

    变量声明

PLSQL子程序体;

1)存储函数入门:

create or replace
function querySal(eno in number)
return number
as
vsal emp2.sal%type;
begin
  select sal into vsal from emp2 where empno=eno;
  return vsal;
end;

测试上述代码:

2)带有输出参数的存储函数

create or replace
function queryFuncEmpSal (eno in number,pname out VARCHAR2,psal out number)
return number
as
begin
  select ename ,sal into pname,psal from emp2 where empno=eno;
  return 1;
end;

================================================================================================

通过jdbc调用存储过程和存储函数

1)搭建环境

导入oracle的jar包:E:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib

2)写工具类JDBCUtils

package cn.itcast.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
	private static String jdbcUrl="jdbc:oracle:thin:@localhost:1521:orcl";
	private static String driverClass="oracle.jdbc.OracleDriver";
	private static String username="scott";
	private static String password="169500";
	/**
	 * 获取数据库连接
	 *
	 */
	public static Connection getConnection(){
		try {
			Class.forName(driverClass);//注册驱动
			return DriverManager.getConnection(jdbcUrl, username, password);
		} catch (Exception e) {
			throw new RuntimeException();
		}
	}
	/**
	 * 关闭资源
	 * public
	 */
	public static void closeResource(Connection conn,Statement state,ResultSet rs){
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				conn=null;
			}
		}
		if(state!=null){
			try {
				state.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				state=null;
			}
		}
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				rs=null;
			}
		}
	}
}

2)测试存储过程:

package cn.itcast.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import oracle.jdbc.internal.OracleTypes;
import org.junit.Test;

import cn.itcast.util.JDBCUtils;

public class TestProcedure {
	 Connection con=null;
	 CallableStatement call=null;
	 @Test
	public void test() throws Exception{
		String sql="{call addSal(?)}";
		con=JDBCUtils.getConnection();
		call=con.prepareCall(sql);
		call.setObject(1, 7369);
		//设置参数
		call.execute();//执行

		//显示结果
		JDBCUtils.closeResource(con, call, null);
	}
	@Test
	public void test1() throws Exception{
		String sql="{call queryEmpSal(?,?,?)}";
		con=JDBCUtils.getConnection();
		call=con.prepareCall(sql);
		//设置输入参数
		call.setObject(1, 7369);
		//设置输出参数
		call.registerOutParameter(2, OracleTypes.VARCHAR);
		call.registerOutParameter(3, OracleTypes.NUMBER);
		call.execute();//执行

		//显示结果
		String name = (String) call.getObject(2);
		Double value = call.getDouble(3);
		System.out.println(name+":"+value);
		JDBCUtils.closeResource(con, call, null);
	}
}

单元测试test1()

3)测试存储函数-->关于sql的写法去jdk中的

package cn.itcast.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;

import oracle.jdbc.internal.OracleTypes;

import cn.itcast.util.JDBCUtils;

public class TestFunction {
	@Test
	public void test() throws Exception{
		Connection conn=null;
		CallableStatement call=null;
		String sql="{?=call querySal(?)}";
		conn=JDBCUtils.getConnection();
		call=conn.prepareCall(sql);
		call.setObject(2,7934);
		call.registerOutParameter(1, OracleTypes.NUMBER);
		//执行结果
		call.execute();
		//获取返回结果
		Object object = call.getObject(1);
		System.out.println(object);

	}
}

注意:关于sql的写法去jdk中的:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 07:02:16

oracle学习笔记之存储过程与存储函数的相关文章

Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

PL/SQL子程序 包括函数和过程.这里的函数指的是用户自己定义的函数,和系统函数是不同的.子程序一般是完成特定功能的PL/SQL程序块,并且具有一定的通用性,可以被不同的应用程序多次调用.Oracle提供可以把PL/SQL程序存储在数据库中,并可以再任何地方来运行它.这样就叫做存储过程或者是函数.过程和函数的唯一区别就是函数总是向调用者返回数据,而过程则不返回数据. 函数 如果用户要经常执行某些操作,并且需要返回特定的数据,那么就可以将这些操作构造成一个函数. 可以使用SQL语句定义函数. 基

Oracle系列:(29)存储过程和存储函数

1.存储过程[procedure] 什么是存储过程? 事先运用oracle语法写好的一段具有业务功能的程序片段,长期保存在oracle服务器中,供oracle客户端(例如,sqlplus)和程序语言远程访问,类似于Java中的函数. 为什么要用存储过程? (1)PLSQL每次执行都要整体运行一遍,才有结果 (2)PLSQL不能将其封装起来,长期保存在oracle服务器中 (3)PLSQL不能被其它应用程序调用,例如:Java 存储过程与PLSQL是什么关系? 存储过程是PLSQL的一个方面的应用

oracle学习笔记 存储及raid技术概述

oracle学习笔记 存储及raid技术概述 本课以oracle数据库所运行的环境,讲一下存储和raid技术. 一)oralce生产环境里的结构 先说一下oracle所在的环境. 有一种结构: 两个服务器.两个光纤存储交换机.两个存储, 它们通过网线相互连接在一起. 每个服务器接两个交换机, 每个交换机连两个服务器同时连两个存储, 每个存储和两个交换机有连接. 这是oracle数据库相对比较典型的正规的运行环境. 每个服务器上都装Linux和oracle数据库软件, oracle数据库建在存储上

Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: CURSOR  游标名  [ (参数名  数据类型,参数名 数据类型,...)]  IS  SELECT   语句; 例如:cursor c1 is select ename from emp; 游标

oracle存储过程和存储函数&触发器

oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 =========================创建和使用存储过程============================= 用create procedure命令建立存储过程和存储函数 语法: create [or replace] procedure 过程名(参数列表) as PLSQL子程序

存储过程,存储函数(Oracle)

存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 存储过程和存储函数的区别? 存储函数:可以通过return 语句返回函数值. 存储过程:不能 除此之外我们可以认为他们是完全一样的. 存储过程 1.创建存储过程 用create procedure命令简历存储过程. 语法: create [or replace] procedure 过程名(参数列表) as PLSQL子程序体: 打印hello word --打印hello world create or re

编程开发之--Oracle数据库--存储过程和存储函数(1)

1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or replace] PROCEDURE 过程名(参数列表) AS PLSQL子程序体; 存储过程的调用方式: a)exec/execute 过程名(); b)begin 过程名(); 过程名(); end; / 带参数的存储过程: 举例:为指定的员工涨100块钱工资,并且打印涨前以及涨后的工资. 在sql

【Oracle学习笔记】

内容主要包含: (1)三种循环及其简化 (2)游标的使用 (3)异常处理 (4)存储过程 (5)存储函数 (6)触发器 (7)其他pl/sql操作 ---------------loop循环定义变量-------------------- declare cursor c1 is select * from emp;# rec emp%rowtype;# i numeber:=1; # v_count number;begin# select count(*) into v_count from

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH