procedure function和function的区别

plsql中的procedure和function编程
plsql中的procedure和function
procedure:存储过程
create or replace procedure p & --这儿是和plsql的区别
& & & & is
& & & & cursor c
& & & & is&
& & & & & & select * from emp2 for &
& & & & --v_temp c%
& & & & for v_temp in c&
& & & & & & loop&
& & & & & & & & & & if(v_temp.sal& 2000) then
& & & & & & & & & & & & update emp2 set sal=sal*2
& & & & & & & & & & elsif(v_temp.sal = 5000) then
& & & & & & & & & & & & delete from emp2 &
& & & & & & & & & &
& & & & & &
& & & & & &
执行过程的命令: & &
带参数的存储过程;
create or replace procedure p & --in表示传入参数 out传出参数,
& & & & (v_a in number,v_b number ,v_ret out number,v_temp in out number)
& & & & if(v_a & v_b) then
& & & & & & & & v_ret := v_a;
& & & & else
& & & & & & v_ret := v_b;
& & v_temp := v_temp+1;
调用过程:
& & & & v_a number := 3;
& & & & v_b number := 4;
& & & & v_
& & & & v_temp number := 5;
& & & & & & p(v_a,v_b,v_ret,v_temp);
& & & & & & dbms_output.put_line(v_ret);
& & & & & & dbms_output.put_line(v_temp);
函数:function
create or replace &function sal_tax
& & & & (v_sal number) & --声明了一个函数
& & & & return number
& & & & if(v_sal & 2000) then
& & & & & & & & return 0.10;
& & & & elsif(v_sal & 2750) then
& & & & & & & & return 0.15;
& & & & else
& & & & & & & & return 0.20;
函数的调用::select lower(ename),sal_tax(sal)
触发器:trigger&
不能直接执行,依赖于表
create table emp2_log
& & uname varchar2(20),
& & action varchar2(10),
& & atime date
创建触发器
create or replace trigger trig
& & & & after insert or delete or update on emp2 for each row
& & & & if inserting then
& & & & & & insert into emp2_log values (USER,'insert',sysdate);
& & & & elsif updating then
& & & & & & insert into emp2_log values(USER,'update',sysdate);
& & & & elsif & deleting then
& & & & & & insert into emp2_log values (USER,'delete',sysdate);
update emp2 set sal=sal*2 where deptno = 30;
create &or replace trigger & &trig
& & & & after update on dept
& & & & for each row&
& & & & update emp set deptno =:NEW.deptno where deptno = :OLD.
update dept set deptno = 99 where deptno = 10;
树状结构的存储于显示:
create table ariticle
& & & & & & id number primary key,
& & & & & & cont varchar2(4000),
& & & & & & pid number,
& & & & & & isleaf number(1), -- 0代表非叶子节点,1代表叶子节点
& & & & & & alevel number(2)
insert into ariticle values(1,'ahshdhshd',0,0,0);
insert into ariticle values(2,'bhshdhshd',1,0,1);
insert into ariticle values(3,'chshdhshd',2,1,2);
insert into ariticle values(4,dhshdhshd',2,0,2);
insert into ariticle values(5,'ehshdhshd',4,1,3);
insert into ariticle values(6,'fhshdhshd',10,1);
insert into ariticle values(7,'ghshdhshd',6,1,0);
insert into ariticle values(8,'hhshdhshd',3,0,4);
insert into ariticle values(9,'ihshdhshd',7,0,0);
insert into ariticle values(10,'jhshdhshd',9,0,3);
create or replace procudure p (v_pid ariticle.pid%type,v_level binary_integer)
is cursor c&
& & is select * from ariticle where pid = v__
& & v_preStr varchar2(1024) :='';
& & for i in 0..v_level loop
& & & & v_preStr :=v_preStr || ' & & & ';
& & & & for v_ariticle in c&
& & & & loop
& & & & dbms_output.put_line(v_preStr || v_ariticle.cont);
& & & & & &if (v_ariticle.isleaf = 0) then
& & & & & & & & p(v_ariticle.id,v_level+1);
& & & & & &
exec p(0);谈谈sqlserver自定义函数与存储过程的区别
投稿:mdxy-dxy
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了谈谈sqlserver自定义函数与存储过程的区别,需要的朋友可以参考下
一、自定义函数:
  1. 可以返回表变量
  2. 限制颇多,包括
    不能使用output参数;
    不能用临时表;
    函数内部的操作不能影响到外部环境;
    不能通过select返回结果集;
    不能update,delete,数据库表;
  3. 必须return 一个标量值或表变量
  自定义函数一般用在复用度高,功能简单单一,争对性强的地方。
二、存储过程
  1. 不能返回表变量
  2. 限制少,可以执行对数据库表的操作,可以返回数据集
  3. 可以return一个标量值,也可以省略return
   存储过程一般用在实现复杂的功能,数据操纵方面。
=========================================================================
SqlServer存储过程--实例
实例1:只返回单一记录集的存储过程。
  表银行存款表(bankMoney)的内容如下
要求1:查询表bankMoney的内容的存储过程
create procedure sp_query_bankMoney
select * from bankMoney
exec sp_query_bankMoney
注* 在使用过程中只需要把T-Sql中的SQL语句替换为存储过程名,就可以了很方便吧!
实例2(向存储过程中传递参数):
加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。
Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output
with encryption ---------加密
insert into bankMoney (id,userID,sex,Money)
Values(@param1,@param2,@param3, @param4)
select @param5=sum(Money) from bankMoney where userID='Zhangsan'
在SQL Server查询分析器中执行该存储过程的方法是:
declare @total_price int
exec insert_bank '004','Zhangsan','男',100,@total_price output
print '总余额为'+convert(varchar,@total_price)
在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:使用带有复杂 SELECT 语句的简单过程
  下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info_all' AND type = 'P')
DROP PROCEDURE au_info_all
CREATE PROCEDURE au_info_all
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
  au_info_all 存储过程可以通过以下方法执行:
  EXECUTE au_info_all
EXEC au_info_all
  如果该过程是批处理中的第一条语句,则可使用:
  au_info_all
实例4:使用带有参数的简单过程
  CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
  au_info 存储过程可以通过以下方法执行:
  EXECUTE au_info 'Dull', 'Ann'
EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
EXEC au_info 'Dull', 'Ann'
EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
EXEC au_info @firstname = 'Ann', @lastname = 'Dull'
  如果该过程是批处理中的第一条语句,则可使用:
  au_info 'Dull', 'Ann'
au_info @lastname = 'Dull', @firstname = 'Ann'
au_info @firstname = 'Ann', @lastname = 'Dull'
实例5:使用带有通配符参数的简单过程
CREATE PROCEDURE au_info2
@lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname LIKE @firstname
AND au_lname LIKE @lastname
  au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:
  EXECUTE au_info2
EXECUTE au_info2 'Wh%'
EXECUTE au_info2 @firstname = 'A%'
EXECUTE au_info2 '[CK]ars[OE]n'
EXECUTE au_info2 'Hunter', 'Sheryl'
EXECUTE au_info2 'H%', 'S%'
  = 'proc2'
实例6:if...else
存储过程,其中@case作为执行update的选择依据,用if...else实现执行时根据传入的参数执行不同的修改.
--下面是if……else的存储过程:
if exists (select 1 from sysobjects where name = 'Student' and type ='u' )
drop table Student
if exists (select 1 from sysobjects where name = 'spUpdateStudent' and type ='p' )
drop proc spUpdateStudent
create table Student
fName nvarchar (10),
smallint ,
fDiqu varchar (50),
insert into Student values ('X.X.Y' , 28, 'Tesing' , 888888)
create proc spUpdateStudent
@fCase int ,
@fName nvarchar (10),
@fAge smallint ,
@fDiqu varchar (50),
update Student
set fAge = @fAge, -- 传 1,2,3 都要更新 fAge 不需要用 case
fDiqu = (case when @fCase = 2 or @fCase = 3 then @fDiqu else fDiqu end ),
fTel = (case when @fCase = 3 then @fTel else fTel end )
where fName = @fName
select * from Student
-- 只改 Age
exec spUpdateStudent
@fCase = 1,
@fName = N'X.X.Y' ,
@fAge = 80,
@fDiqu = N'Update' ,
@fTel = 1010101
-- 改 Age 和 Diqu
exec spUpdateStudent
@fCase = 2,
@fName = N'X.X.Y' ,
@fAge = 80,
@fDiqu = N'Update' ,
@fTel = 1010101
exec spUpdateStudent
@fCase = 3,
@fName = N'X.X.Y' ,
@fAge = 80,
@fDiqu = N'Update' ,
@fTel = 1010101
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Oracle中函数和存储过程的区别总结版 - 简书
Oracle中函数和存储过程的区别总结版
昨天下午和今天上午找了也看了很多资料,现在基本上已经把二者的区别理清楚,以后不要再弄混淆,也算是一种小小的进步吧,而不去想以后会怎样。
一、主要区别
1、二者最大的区别是:
1).函数(function)总是向调用者返回数据,并且一般只返回一个值;
2).存储过程(procedure)不直接返回数据,但可以改变输出参数的值,这可以近似看作能返回值,且存储过程输出参数的值个数没有限制。
从一般应用上来看,如果不需要返回值或者需要多个返回值,使用存储过程,如果只用一个返回值,就使用函数。
2、function定义中只能有DDL(如select等)语句;procedure中主要是DML语句(对数据库进行复杂操作时,如对多个表进行Update、Insert、Query、Delete时)。
如果想要使用select的结果集,则要使用游标
以下需要注意的地方是:
1).定义函数或者存储过程时,IN/OUT表示调用函数时,传进来或传出去的参数。如果没有说明in/out,则默认为in;
2).定义的函数必须要有return子句,其后紧跟着返回值得类型;
3).实际调用函数或存储过程时,在declare中声明的变量至少应该对应创建的函数或存储过程中的OUT参数和return参数合起来的个数;
4).可以建立不带参数(即没有返回的参数)、没有变量的存储过程。
5)执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1())。
3、存储过程的命名最好以proc_打头,函数则是func_打头,变量则应该用v_打头。
Paste_Image.png
二、实际举例
(1)创建函数
create or replace function get_salary(
dept_no number,
emp_count **out** number)
return number IS
end get_salary
(2)调用函数
...(这里应该出现函数名表示调用)
2、存储过程
(1)创建存储过程
create or replace procedure pro_demo(
dept_no number default 10,
sal_sum out number,
emp_count out number)
(2)调用存储过程
调用语法:
1)、exec &过程名&;
2)、execute &过程名&;
3)、在PL/SQL语句块中直接调用。
v_sum number(8,2);
procedure pro_demo(dept_no=&1,sal_num=&900,emp_count=&10)(这里出现存储过程名表示调用,传递参数值用=&)
3、本地存储过程
在PL/SQL中还可以在declare块中建立本地存储过程,而不使用关键字create,其目的是:不用将存储过程存储在数据库中,避免更改数据库时带来的麻烦,其主要的使用场景是,临时使用某个存储过程,而不是在以后要重复多次使用。
v_sum number(8,2);
procedure proc_demo(
dept_no number default 10,
sal_sum out number,
emp_count out number)
...(这里不用出现存储过程名)
这里再次复习一下DDL(data defined language),DML(data manipulation language ),DCL(data control language)的区别:
1).DDL的操作对象(表)Create语句:可以创建数据库和数据库的一些对象。Drop语句:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等。Alter语句:修改数据表定义及属性。
2).DML操作的对象是记录(即数据)最常见的是增(insert)、删(delete)、改(update)、查(select)
3).DCL操作的对象是数据库用户的权限Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。Revoke语句:可以废除某用户或某组或所有用户访问权限
愿我长命百岁,yu你终老2007年6月 C++ Builder大版内专家分月排行榜第二2007年3月 C++ Builder大版内专家分月排行榜第二2007年1月 C++ Builder大版内专家分月排行榜第二2006年1月 C++ Builder大版内专家分月排行榜第二2005年12月 C++ Builder大版内专家分月排行榜第二2005年11月 C++ Builder大版内专家分月排行榜第二2005年7月 C++ Builder大版内专家分月排行榜第二2004年12月 C++ Builder大版内专家分月排行榜第二
2007年2月 C++ Builder大版内专家分月排行榜第三2007年6月 Delphi大版内专家分月排行榜第三2006年2月 C++ Builder大版内专家分月排行榜第三2005年10月 C++ Builder大版内专家分月排行榜第三2004年7月 C++ Builder大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 oracle查询某个时间 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信