版权声明:本文为博主九师兄(QQ群:spark源代码 198279782 欢迎来探讨技术)原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21383435/article/details/81987165
1. 定义
所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一系列的数据库操作。
2. 无参存储过程
create or replace procedure NoParPro
as //声明
;
begin // 执行
;
exception//存储过程异常
;
end;
3. 存储过程中类型参数的传递
3.1. in 类型
这是一个输入类型,表示将这个参数输入给存储过程。
create or replace procedure double(in_num in NUMBER, out_num out NUMBER) is
begin
out_num:=in_num * 2;
end double;
3.2. out 类型
这是一个输出类型,意思就是这个参数在存储过程中被赋值,最后将其传递出去。
3.3. in out 类型
这个类型就是上面提到两种类型的综合版本。
create or replace procedure double2(in_out_num in out NUMBER) is
begin
in_out_num:=in_out_num * 2;
end double2;
4.调用方式
4.1 直接执行
BEGIN
--执行存储过程
PROCEDURE_TEST('T01', 'te;[email protected]');
END;
4.2 java通过thin调用,代码如下(关键代码):
Class.forName("数据库驱动包");
Connection conn = DriverManager.getConnection("连接字符串", "用户名", "密码");
CallableStatement proc = null;
proc = conn.prepareCall("{ call PROCEDURE_TEST(?,?) }");
proc.setString(1, "T01");
proc.setString(2, "[email protected]");
proc.execute();
4.3 命令行
SQL>exec proc_emp('参数1','参数2');//无返回值过程调用
SQL>var vsal number
SQL> exec proc_emp ('参数1',:vsal);// 有返回值过程调用
SQL> call proc_emp ('参数1',:vsal);// 有返回值过程调用
注意:ORA-00900: 无效 SQL 语句(错误原因之一)是sql语句有错误
5. 删除存储过程
语法:
DROP PROCEDURE 存储过程名;
如:drop procedure hello_world;
6. 查询我们创建的存储过程
我在名字为ZTY的scheam下创建了一个存储过程
下面这样子是查询不到的,因为这个默认查询schema为当前用户下的存储过程
Select * from user_source where name = 'P_TEST';
下面这种是全局查找OWNER='schema名称' name='存储过程名称大写'
select text from all_source where OWNER='ZYT' and name='P_TEST';
注意: name = 后面的存储过程必须大写
- user开头的是当前用户
- all是当前用户有权限的对象
- dba开头的是整个库下的对象
- oracle的schema跟连接用户的userName是同个意思(
schema=userName
) - system用户是管理数据库的用户
7.完整案例
7.1 创建表
create table test (id int,name varchar2(10),counts int);
7.2 添加数据
insert into test values (1,'张三',100);
insert into test values (2,'李四',200);
commit;
7.3 创建存储过程
create or replace procedure p_test
--创建存储过程,
as
v_counts int;--定义变量
begin --开始
select sum(counts) into v_counts from test;--将得到的结果放到变量里
DBMS_OUTPUT.PUT_LINE(v_counts);--将结果打印输出
end;--结束
7.4 可以看到
7.5 调用存储过程
call p_test()
结果打印 300
7.6 获取某个schema下的所有的存储过程
select * from dba_objects where OBJECT_TYPE='PROCEDURE' and OWNER='ZYT';
7.7 获取某个schema下的某个存储过程的详细信息
select * from all_source where OWNER='ZYT' and name='P_TEST';
注意:获取默认的schema SYSTEM下的存储过程,可以使用这个
Select * from user_source where name = 'P_TEST';
参考: