三、存储过程(Stored Procedure)与游标(Cursor)
一、存储过程
一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数,来执行它。
在大型数据库中,存储过程和触发器具有重要的作用。无论是存储过程还是触发器,都是SQL语句和流程控制语句的集合。
存储过程的优点:
1、存储过程只在创造时进行编译,以后每次执行存储过程都不需要重新编译,一般的SQL语句执行一次就要编译一次,所以使用存储过程可以提高数据库执行速度。
2、当对数据库进行复杂操作时(比如对多个表进行CRUD时),可以将复杂的CRUD操作用存储过程封装起来与数据库提供的事务处理结合在一块使用。
3、存储过程可以重复使用,可以减少数据库开发人员的工作量。
4、存储过程安全性搞,可以设定只有某个用户才具有对指定存储过程的使用权。
Oracle的存储过程分为两种:系统存储过程和自定义存储过程。
系统存储过程:Oracle预先提供的一组完成特功能的存储过程,安装完Oracle 就有。
自定义存储过程:
Create [Or Replace] Procedure 过程名[参数[in/out/in out]]
AS/IS
说明部分
BEGIN
可执行部分
[EXCEPTION 错误处理部分]
END [过程名];
注:可选的replace:表示如果存储过程已经存在,则用新的存储过程覆盖掉原来的,常用语存储过程的重建。
参数部分:用于定义多个参数(如果没有参数,可以不写),参数有三种形式:IN,OUT,INT OUT。一般没有指定参数形式的话,默认为IN。
关键字AS也可以写成IS,后面跟存储过程的说明部分,也可以在这块定义存储过程的局部变量。
删除存储过程: DROP PROCEDURE 存储过程名;
--创建一个统计产品表总数的存储过程
CREATE OR REPLACE PROCEDURE product_count
AS
PRODUCT_SUM NUMBER(10);
BEGIN
SELECT COUNT(*) INTO PRODUCT_SUM FROM product_table;
DBMS_OUTPUT.PUT_LINE('产品数量是:'||PRODUCT_SUM);
END;
无参的存储过程:
--创建一个打印HelloWorld的无参存储过程
create or replace procedure printHelloWorld
as
--说明部分
begin
dbms_output.put_line('Hello World');
end printHelloWorld; --无参数存储过程的调用
方法1、exec printHelloWorld();
方法2、begin
printHelloWorld();
end;
二、游标(Cursor)
游标:一种PL/SQL控制结构,对SQL语句的处理进行显示控制,便于对表的行数据逐条进行处理。,游标只存留在内存中。一般使用方法是:声明游标--->打开游标--->取出结果--->关闭游标。
一般使用for循环来操作游标
--利用for循环创建操作游标
DELCARE --声明游标
CURSOR testCursor IS SELECT * FROM product_table where id=1;
productInfo product_table%ROWTYPE;--ROWTYPE类型:表示一行的数据
count NUMBER;
BEGIN --开始操作游标
FOR productInfo IN testCursor
LOOP
count:=testCursor%ROWCOUT;--ROWCOUNT 对游标所操作的行数进行记录
DBMS_OUTPUT.put_line(count||'产品编号:'||productInfo.id);
DBMS_OUTPUT.put_line(count||'产品名称:'||productInfo.name);
END LOOP;
END;
游标的作用:
1、指定结果集中特定行的位置
2、根据当前的结果接位置检索一行或者连续的几行
3、在结果集的当前位置修改行中的数据
4、对其他用户所做的数据更改定义不同的敏感级别
5、根据编程的方式访问数据库
因为游标的效率比较差,如果游标操作的数据超过一万行,那么就要改写。
显式游标:用户显式的声明的游标,也就是指定的结果集,当查询返回结果超过一行,就需要一个显式游标。
隐式游标:所有的CRUD记录为隐式游标,系统帮我们定义。
%Found:用于校验游标是否成功。
%NotFound:最后一条记录是否提取,到了游标的尾部,没有记录了就返回true
%ISOpen:游标是否打开,打开为true
%RowCount:游标当前提取的行数。
三、创建函数
语法:
create [or replace] function 函数名(参数列表[in/out/in out])
--参数列表的类型:in:输入的参数,out:返回的参数,in out:即是输入参数也是返回参数
return datatype--返回值类型
as/is
说明部分
begin
--执行的SQL
end;
--创建一个计算产品平均价格的函数
create or replace function avg_function_product(product_sum_price in number(10,2),product_count in out number(10,2)) return number(10,2)
as
product_price number(10,2);
begin
product_price:=product_sum_weight/product_count; return product_price;
end;
--创建一个比较大小的自定义函数
create or replace function testCompare(args1 in number,args2 in number)
return number
as
begin
if args1>args2 then
return args1;
else
return args2;
end if;
end testCompare; --测试调用
select testCompare(12,57) from product_table;
三、存储过程(Stored Procedure)与游标(Cursor)的更多相关文章
- Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?
在 SQL Server 创建或修改「存储过程(stored procedure)」时,可加上 WITH RECOMPILE 选项,但多数文档或书籍都写得语焉不详,或只解释为「每次执行此存储过程时,都 ...
- SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...
- JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted,
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- SQL Server——存储过程(Stored Procedure)、事物、触发器
存储过程(proc 或 procedure) 存储过程(Stored Procedure),计算机用语,是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL ...
- 数据库之存储过程(Stored Procedure)【未完待续】
存储过程(Stored Procedure,以下简称SP)是啥?有什么用?优缺点? 一个SP是一段存储在数据库系统中的一条或多条sql语句的集合,类似一条批处理,它能被触发器,或者其他的SP以及APP ...
- EntityFramework 学习 一 CRUD using Stored Procedure: 使用存储过程进行CRUD操作
我们先创建如下3个存储过程 1.Sp_InsertStudentInfo: CREATE PROCEDURE [dbo].[sp_InsertStudentInfo] -- Add the param ...
- stored procedure --存储过程
存储过程(Stored Procedure),计算机用语,是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL语言所编写的程序.经编译后存储在数据库中.存储 ...
- 存储过程代码生成器Stored Procedure Generator
原文发布时间为:2010-10-26 -- 来源于本人的百度文章 [由搬家工具导入] Stored Procedure Generator (for SQL Server 2000/2005) htt ...
- T-SQL应用,视图、存储过程、触发器、游标、临时表等
sqlserver常用操作: 视图.存储过程.触发器.函数 --*********************批处理********************* --[在一个批处理中存有一个语法错误,则所有 ...
随机推荐
- Linux学习之用户与root
因为想要建立建立一个目录,但是发现权限不够,因为没用root登陆,所以学习了一下普通用户与root之间如何切换以及如何创建用户的一些知识. 1.pwd命令可以查看当前用户 $这个符号代表的就是普通用户 ...
- BZOJ 2809: [Apio2012]dispatching(左偏树)
http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题意: 思路:最简单的想法就是枚举管理者,在其子树中从薪水低的开始选起,但是每个节点都这样处理 ...
- jQuery从0到1
jQuery不需要安装,把下载的jquery.js文件放在网站上的一个公共的位置,需要在某个页面使用jQuery时,再相对引用即可.——其中有压缩版和未压缩版,分别用于开发和发布.http://jqu ...
- cmake用法及常用命令总结
CMakeLists.txt 的语法比较简单,由命令.注释和空格组成,其中命令是不区分大小写的.指令是大小写无关的,参数和变量是大小写相关的.但推荐全部使用大写指令.符号 # 后面的内容被认为是注释. ...
- L1-047. 装睡
水题直接上代码: #include<iostream> #include<algorithm> using namespace std; int main() { int n; ...
- The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet- mapping*,session-config?,mime-map
修改了一下web.xml,加入了一个<filter>,然后就报这样的错??? The content of element type "web-app" must ma ...
- JNI手动释放内存(避免内存泄露)
. 哪些需要手动释放? 不要手动释放(基本类型): jint , jlong , jchar 需要手动释放(引用类型,数组家族): jstring,jobject ,jobjectArray,jint ...
- 学习笔记50—多重假设检验与Bonferroni校正、FDR校正
总结起来就三句话: (1)当同一个数据集有n次(n>=2)假设检验时,要做多重假设检验校正 (2)对于Bonferroni校正,是将p-value的cutoff除以n做校正,这样差异基因筛选的p ...
- JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val()
一.JS中innerHTML.outerHTML.innerText .outerText.value的区别与联系?jS中设置或者获取所选内容的值:①innerHTML :属性设置或返回该标签内的HT ...
- 【转载】LINUX下安装wget命令(SFTP实现法)
如何安装wget命令. 方法一:通过yum 命令行为:yum install wget 完成.此操作很简单,但是我安装的linux是centos的最小版本,运行上述命令时会出现无法连接到源网站(大概是 ...