语法:
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字;
参数模式
一:可以在sql窗口写存储过程,写好后点击运行即可创建。
调用方式一:call 存储过程名(参数列表);
调用方式二:
begin
存储过程名(参数列表);
end;
二:在命令窗口写存储过程,写完后 ‘/’ 回车 执行。
调用:EXEC/EXECUTE 存储过程名(参数列表);
或
BEGIN
存储过程名(参数列表);
END;
/
调用存储过程方式三:
删除存储过程
DROP PROCEDURE procedure-name;
BEGIN DROP PROCEDURE procedure-name
; END; /
案例1:该程序查找两个值中的最小值,这里过程使用IN模式接收两个数字,并使用OUT参数返回它们的最小值。
DECLARE
a number;
b number;
c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS
BEGIN
IF x < y THEN
z:= x;
ELSE
z:= y;
END IF;
END;
BEGIN
a:= 23;
b:= 45;
findMin(a, b, c);
dbms_output.put_line(' Minimum of (23, 45) : ' || c);
END;
/
案例2:这个程序计算传递值的平方值。这个例子表明我们如何能够用相同的参数接受的值,然后返回另一个结果。
DECLARE
a number;
PROCEDURE squareNum(x IN OUT number) IS
BEGIN
x := x * x;
END;
BEGIN
a:= 23;
squareNum(a);
dbms_output.put_line(' Square of (23): ' || a);
END;
/
方法传递参数
实际参数可以通过以下三种方式:
位置标记
命名符号
混合符号
位置表示法
在位置符号,可以调用的程序为:
findMin(a, b, c, d);
在位置表示法中,第一实际参数代入所述第一形式参数;第二实际参数代入所述第二形式参数,依此类推。那么,a取代x,b是取代为y,c为取代z以及d被代替m。
命名表示法
名为符号,实际参数与使用箭头符号的形式参数相关的(=>)。所以程序调用将如下所示:
findMin(x=>a, y=>b, z=>c, m=>d);
混合表示法
在混合符号表示法中,可以混合这两种写法过程调用;但是,位置标记应先于指定符号。
合法的:
findMin(x=>a, b, c, d);
jdbc调用存储过程
案例1:无返回值
create or replace procedure proc_delEmp(id in number) is
begin
delete from emp where emp.employee_id = id;
end proc_delEmp;
Java调用:
//加载Oracle的驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//设计连接
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "itsource", "itsource");
//准备好要执行的存储过程(注意语法,传的参数个数)
CallableStatement call = connection.prepareCall("{call proc_delEmp(?)}");
call.setLong(1, 106); //第一个位置输入值
call.executeUpdate(); //执行存储过程
connection.close();
call.close();
案例2:有返回值
create or replace procedure getEmpNameById(id in number,name out varchar2) is
begin
select first_name into name from emp where employee_id = id;
end getEmpNameById;
Java调用:
public void test() throws Exception {
//贾涟欲执事
//加载Oracle的驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//设计连接
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "itsource", "itsource");
//准备好要执行的存储过程(注意语法,传的参数个数)
CallableStatement call = connection.prepareCall("{call proc_getEmpNameById(?,?)}");
call.setLong(1, 106); //第一个位置输入值
call.registerOutParameter(2, Types.VARCHAR); //注册一个输出的值
call.executeUpdate(); //执行存储过程
System.out.println(call.getString(2)); //有输出的值可以在这里输出
connection.close();
call.close();
}