SQL存储过程的几个简单例子

时间:2021-10-18 20:49:43

例1:

create proc proc_stu 
@sname varchar(20), 
@pwd varchar(20) 
as 
select * from ren where sname=@sname and pwd=@pwd 
go

查看结果:proc_stu 'admin','admin'

例2:

下面的存储过程实现用户验证的功能,如果不成功,返回0,成功则返回1.

CREATE PROCEDURE VALIDATE @USERNAME CHAR(20),@PASSWORD CHAR(20),@LEGAL BIT OUTPUT 
AS

IF EXISTS(SELECT * FROM REN WHERE SNAME = @USERNAME AND PWD = @PASSWORD) 
SELECT @LEGAL = 1 
ELSE 
SELECT @LEGAL = 0

在程序中调用该存储过程,并根据@LEGAL参数的值判断用户是否合法。

例3:一个高效的数据分页的存储过程 可以轻松应付百万数据

CREATE PROCEDURE pageTest --用于翻页的测试
--需要把排序字段放在第一列

(
@FirstID nvarchar(20)=null, --当前页面里的第一条记录的排序字段的值
@LastID nvarchar(20)=null, --当前页面里的最后一条记录的排序字段的值
@isNext bit=null, --true 1 :下一页;false 0:上一页
@allCount int output, --返回总记录数
@pageSize int output, --返回一页的记录数
@CurPage int --页号(第几页)0:第一页;-1最后一页。
)

AS

if @CurPage=0--表示第一页
begin
--统计总记录数
select @allCount=count(ProductId) from Product_test 

set @pageSize=10
--返回第一页的数据
select top 10 
ProductId,
ProductName,
Introduction 
from Product_test order by ProductId 
end

else if @CurPage=-1--表示最后一页

select * from 
(select top 10 ProductId,
ProductName,
Introduction

from Product_test order by ProductId desc ) as aa 
order by ProductId
else

begin 
if @isNext=1
--翻到下一页
select top 10 ProductId,
ProductName,
Introduction
from Product_test where ProductId > @LastID order by ProductId 
else
--翻到上一页
select * from
(select top 10 ProductId,
ProductName,
Introduction
from Product_test where ProductId < @FirstID order by ProductId desc) as bb order by ProductId
end

上文中讲到的这三个例子都是sql存储过程比较典型的例子,希望大家好好学习,都能够学到大家各自需要的东西。

原文出处:http://www.codesky.net/article/201103/144215.html


自己练习的:

create table tb_student
(
id integer,
name varchar(20),
chinese number,
math number
);
insert into tb_student values(1,'小明',90,80);
insert into tb_student values(2,'小王',60,70);
insert into tb_student values(3,'小张',90,70);

select * from tb_student;

--无返回值的存储过程
create or replace procedure xs_proc_no is
begin
insert into tb_student values(4,'小李',70,80);
commit;
end xs_proc_no;
--无参存储过程的调用
declare
begin
xs_proc_no;
end;
---带参数的存储过程
create or replace procedure xs_proc(temp_name in varchar2,
temp_num out number) is
num_1 number;
num_2 number;
begin
select chinese , math
into num_1, num_2
from tb_student
where name = temp_name;
--dbms_output.put_line(num_1 + num_2);
temp_num := num_1 + num_2;
end;
---带参数的存储过程调用
declare
temp_name varchar2(20);--参数1
temp_num number;--参数2
begin
temp_name:='小李';--初始化参数值(第二个参数是返回的,可以不用初始化)
xs_proc(temp_name=>temp_name,temp_num=>temp_num);--执行存储过程
--或者xs_proc(temp_name,temp_num);
Dbms_Output.put_line(temp_num);
end;

java中调用存储过程

Ⅰ、不带输出参数情况
      过程名称为pro1参数个数1个数据类型为整形数据
 

import  java.sql. * ; 
public class ProcedureNoArgs
{
public static void main(String args[]) throws Exception
{
// 加载Oracle驱动
DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver());
// 获得Oracle数据库连接
Connection conn = DriverManager.getConnection( " jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd " );

// 创建存储过程的对象
CallableStatement c = conn.divpareCall( " {call pro1(?)} " );

// 给Oracle存储过程的参数设置值 ,将第一个参数的值设置成188
c.setInt( 1 , 188 );

// 执行Oracle存储过程
c.execute();
conn.close();
}
}

Ⅱ、带输出参数的情况
   过程名称为pro2参数个数2个数据类型为整形数据,返回值为整形类型

import java.sql.*; 
public class ProcedureWithArgs
{
public static void main(String args[]) throws Exception
{
//加载Oracle驱动
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//获得Oracle数据库连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ");

//创建Oracle存储过程的对象,调用存储过程
CallableStatement c=conn.divpareCall("{call pro2(?,?)}");

//给Oracle存储过程的参数设置值 ,将第一个参数的值设置成188
c.setInt(1,188);
//注册存储过程的第二个参数
c.registerOutParameter(2,java.sql.Types.INTEGER); //执行Oracle存储过程
c.execute();
//得到存储过程的输出参数值并打印出来
System.out.println (c.getInt(2));
conn.close();
}
}

原文出处:http://www.cnblogs.com/chinafine/articles/1776094.html

参考文章:http://www.cnblogs.com/liliu/archive/2011/06/22/2087546.html