存储过程案例

1.创建表

1 CREATE TABLE book
2 (
3        bookId NUMBER,
4        bookName VARCHAR2(50),
5        publishHouse Varchar2(50)
6 )

2.----------有输入参数的存储过程(添加操作)---------------------------------------------------------------------

 1 CREATE OR REPLACE PROCEDURE sp_pro    --创建一个名字为sp_pro的存储过程;
 2 (      --需要输入的参数
 3        spBookId IN NUMBER,            --图书ID
 4        spBookName IN VARCHAR2,        --图书名字
 5        publishHouse IN VARCHAR2       --图书出版社
 6 )
 7 IS     --连接关键字
 8 BEGIN  --块,以begin开始,以end结尾;
 9   INSERT INTO book VALUES(spBookId,spBookName,publishHouse);  --执行部分,将输入的值按顺序插入到名为book的表里
10 END;
11
12 CALL sp_pro(3,‘book3‘,‘china‘);

3.----------有输入和输出参数的存储过程(查询操作)---------------------------------------------------------------

 1 CREATE OR REPLACE PROCEDURE sp_pro2
 2 (
 3        spno IN NUMBER,             --in 表示输入的值,不写默认为 in
 4        spName OUT VARCHAR2,        --out 表示输出的值
 5        spSal OUT NUMBER,
 6        spJob OUT VARCHAR2
 7 )
 8 IS
 9 BEGIN
10   SELECT ename,sal,job INTO spName,spSal,spJob FROM emp WHERE empno = spno; --通过输入的值查询结果并赋给输出的值
11 END;

4.------------返回结果集的存储过程------------------------------------------------------------------------------------

 1 --1.创建一个包,自定义一个游标类型
 2 CREATE OR REPLACE PACKAGE testpackage AS       --创建一个包
 3 TYPE tesr_cursor IS REF CURSOR;                --在包中定义一个名字为tesr_cursor的类型,这个类型是个游标
 4 END testpackage;                               --关闭包
 5 --2.创建过程
 6 CREATE OR REPLACE PROCEDURE sp_pro3
 7 (
 8        spNo IN NUMBER,
 9        p_cursor OUT tesr_cursor        --输出参数p_cursor,它的类型为tesr_cursor(包中定义的类型,是个游标)
10 )
11 IS
12 BEGIN
13   OPEN p_cursor FOR SELECT * FROM emp WHERE deptno = spNo;    --打开游标(open  游标名) 接收参数(for sql语句)
14 END;

5.-----------存储过程分页---------------------------------------------------------------------

 1 --1. 创建一个包,在包中定义一个类型,这个类型是一个游标
 2 CREATE OR REPLACE PACKAGE testpackage AS
 3 TYPE test_cursor IS REF CURSOR;
 4 END testpackage;
 5 --2. 创建分页存储过程
 6 CREATE OR REPLACE PROCEDURE fenye
 7 (
 8        pageSize IN NUMBER,                  -- 页显示条数(每页显示几条数据)
 9        pageNow IN NUMBER,                   -- 当前页
10        myrows OUT NUMBER,                   -- 总记录数(总共有多少条数据)
11        mypagecounts OUT NUMBER,             -- 总页数(总共多少页)
12        p_cursor OUT testpackage.test_cursor -- 返回记录集
13 )
14 IS
15 v_sql VARCHAR2(1000);                       -- 存储 sql 语句
16 v_begin NUMBER := (pageNow-1)*pageSize + 1; -- 计算开始位置
17 v_end NUMBER := pageSize * pageNow;         -- 计算结束位置
18 BEGIN
19   v_sql := ‘select * from ( select t1.*,rownum rn from
20   ( SELECT * FROM ‘||tableName||‘) t1 where rownum<=‘||v_end||‘)
21    where rn>=‘||v_begin||‘‘;
22   OPEN test_cursor FOR v_sql;                  -- 打开游标,存放结果集
23   -- 重新组织一个 sql ,计算总页数
24  v_sql:= ‘SELECT * FROM ‘||tableName;
25  -- (EXECUTE IMMEDIATE)立即执行sql 将结果赋值给 myrows
26  EXECUTE IMMEDIATE v_sql INTO myrows;
27  -- 计算总页数,如果不能被整除(取模MOD(除数,被除数)),则结果加一
28  IF MOD(myrose,pageSize)=0 THEN
29    mypagecontents = myrows/pageSize;
30  ELSE
31     mypagecontents = myrows/pageSize+1;
32  END IF;
33  -- 关闭游标
34  CLOSE test_cursor;
35 END;

6.---------游标(参照类型)------------------------------------------------------------------

 1 DECLARE
 2 --定义游标类型
 3 TYPE sp_emp_cursor IS REF CURSOR;
 4 --定义游标变量
 5 test_cursor sp_emp_cursor;
 6 --定义变量
 7 v_ename emp.ename%TYPE;
 8 v_sal emp.sal%TYPE;
 9 BEGIN
10   OPEN test_cursor FOR SELECT ename,sal FROM emp WHERE deptno = &NO;       --打开游标,将游标与SQL关联;
11   LOOP                -- 循环取出(相当于do--while(),必须执行一次)
12     FETCH test_cursor INTO v_ename,v_sal;    --取出游标里的内容赋值(fetch)
13     EXIT WHEN test_cursor%NOTFOUND;     --当游标为空时退出(必须判断退出,否则死循环)(%notfound判断是否为空)
14     dbms_output.put_line(‘名字:‘||v_ename ||‘ 工资:‘||v_sal);
15   END LOOP;
16   CLOSE test_cursor;
17 END;
时间: 2024-10-12 05:47:43

存储过程案例的相关文章

SQL基础分页存储过程(案例一)

1 --分页 存储过程 案例 2 3 -- 所执行的存储过程 4 create proc pageForUsers 5 @currPage int, --当前页数 6 @pageSize int, --每页多少条记录 7 @count int output --总记录数 8 as 9 declare @firstIndex int 10 declare @lastIndex int 11 declare @sqlText varchar(200) 12 13 --统计总记录数 14 select

[终章]进阶20-流程控制结构--if/case/while结构 - 三个while的存储过程案例(批量生成表单数据) - 随机长度的随机字符串的存储过程案例

1. mysql 存储过程中尽量使用 @变量 而不用局部变量, @变量不容易报错!权限小,更改一下就报错! 2. sql中判断相等'=' ,用'=' 不用'=='. 3. #流程控制结构 /* 顺序结构: 程序从上往下依次执行; 分支结构: 程序从多条路径中选择一条往下执行 循环结构: 程序在满足一定条件的基础上,重复执行一段代码 */ #一: 分支结构 #if 函数 : 实现简单的双分支 /*语法: 实现简单的双分支 if(表达式1,表达式2,表达式3) 执行顺序: 如果表达式1成立, 则if

EF6.0执行sql存储过程案例

数据填充实体:ZF_Btns; 存储过程名称:test; --方式一: db.Database.SqlQuery<ZF_Btns>("test @Id,@UName output",sqlparameters[]); --方式二: db.Database.SqlQuery<ZF_Btns>("EXEC [dbo].[test] @Id,@UName output",sqlparameters[]);

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程案例演示

Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先安装一下Dapper(建议用nuget包来管理) 连接字符串: s

oracle循环调用存储过程案例

如下: create or replace procedure testdate_2 is i number; out1 varchar2(100); out2 varchar2(100); CUSTOMERID NUMBER; cursor projidlist is select p.projid from proj_baseinfo p where p.projstage!='-999'; begin for i in projidlist LOOP begin select p.cust

8、存储过程

一.存储过程介绍和案例1 1 ---修改表字段 2 alter table emp modify deptno not null; 3 4 --注意:存储过程不会报出具体哪行报错,所以要仔细仔细再仔细 5 --1.创建存储过程,完成添加员工的信息.包括编号.名称.薪水.工种和部门编号. 6 --or replace表示如果有已经存在的存储过程则要覆盖 7 create or replace procedure add_emp( 8 v_eno number, --参数,雇员编号 9 v_enam

二十一、oracle pl/sql分类一 存储过程

存储过程用于执行特定的操作,当建立存储过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数,可以将执行部分的数据传递到应用环境.在sqlplus中可以使用create procedure命令来建立过程.实例如下:1.请考虑编写一个存储过程,可以输入雇员名,新工资,用来修改雇员的工资 --根据雇员名去修改工资CREATE PROCEDURE sp_update(uname VARCHAR2, newsal NUMBE

oracle pl/sql 存储过程

存储过程用于执行特定的操作,当建立存储过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数,可以将执行部分的数据传递到应用环境.在sqlplus中可以使用create procedure命令来建立过程.实例如下:1.请考虑编写一个存储过程,可以输入雇员名,新工资,用来修改雇员的工资 --根据雇员名去修改工资CREATE PROCEDURE sp_update(uname VARCHAR2, newsal NUMBE

sql存储过程详解

存储过程简介 什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了. 存储过程的好处: 1.由于数据库执行动作时,是先编译后执行的.然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高. 2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率. 3.通过存储过程能够