
“另一个存储过程”的名字是sp1,没有参数,返回的结果集共3列,全部为int型,那么“存储过程”里添加一个与结果集列数相同的临时表或表变量用于接收“另一个存储过程”的结果集
如下
CREATE
PROCEDURE
sp2
AS
DECLARE
@t
table(a
int,b
int,c
int)
INSERT
INTO
@t(a,b,c)
EXEC
sp1
SELECT
FROM
@t
使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用。
创建存储过程
和数据表一样,在使用之前需要创建存储过程,它的简明语法是:
引用:
Create
PROC
存储过程名称
[参数列表(多个以“,”分隔)]
AS
SQL
例:
引用:
Create
PROC
upGetUserName
@intUserId
INT,
@ostrUserName
NVARCHAR(20)
OUTPUT
--
要输出的参数
AS
BEGIN
--
将uName的值赋给
@ostrUserName
变量,即要输出的参数
Select
@ostrUserName=uName
FROM
uUser
Where
uId=@intUserId
END
其中
Create
PROC
语句(完整语句为Create
PROCEDURE)的意思就是告诉SQL
SERVER,现在需要建立一个存储过程,upGetUserName
就是存储过程名称,@intUserId
和
@ostrUserName
分别是该存储过程的两个参数,注意,在SQL
SERVER中,所有用户定义的变量都以“@”开头,OUTPUT关键字表示这个参数是用来输出的,AS之后就是存储过程内容了。只要将以上代码在“查询分析器”里执行一次,SQL
SERVER就会在当前数据库中创建一个名为“upGetUserName”的存储过程。你可以打开“企业管理器”,选择当前 *** 作的数据库,然后在左边的树型列表中选择“存储过程”,此时就可以在右边的列表中看到你刚刚创建的存储过程了(如果没有,刷新一下即可)。
1、函数必须指定返回值,且参数默认为IN类型。
2、存储过程没返回值,参数可以是 IN,OUT,IN OUT类型,有的人可能会理解成OUT 也算是返回值。
3、调用方式:函数 select my_fun() ;过程 call my_pro( ) ;
4、DEMO
1
2
3
4
5
6
7
8
9
10
11
DELIMITER $$
DROP FUNCTION IF EXISTS my_fun$$
CREATE
FUNCTION my_fun(a INT(2),b INT(2))
RETURNS INT(4)
BEGIN
DECLARE sum_ INT(2) DEFAULT 0;
SET sum_ = a + b;
RETURN sum_;
END$$
DELIMITER ;
1
2
3
4
5
6
7
8
DELIMITER $$
DROP PROCEDURE IF EXISTS my_pro$$
CREATE
PROCEDURE my_pro(IN a INT(2),IN b INT(2) ,OUT c INT(2))
BEGIN
SET c = a + b;
END$$
DELIMITER ;
SQL中存储过程和自定义函数的区别
2008年12月19日来源:233网校评论 分享到 我的做题记录
刚开始学SQL,很快就发现存储过程和数据库自定义函数之间貌似有很多的相同点,所以把其差别简单做下记录,以备以后查阅:
存储过程:
存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:
1、可以在单个存储过程中执行一系列 SQL 语句。
2、可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
3、存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。
用户定义函数:
Microsoft SQL Server 2000 允许创建用户定义函数。与任何函数一样,用户定义函数是可返回值的例程。根据所返回值的类型,每个用户定义函数可分成以下三个类别:
1、返回可更新数据表的函数
如果用户定义函数包含单个 Select 语句且该语句可更新,则该函数返回的表格格式结果也可以更新。
2、返回不可更新数据表的函数
如果用户定义函数包含不止一个 Select 语句,或包含一个不可更新的 Select 语句,则该函数返回的表格格式结果也不可更新。
3、返回标量值的函数
用户定义函数可以返回标量值。
存储过程
功能强大,限制少
不能直接引用返回值
用select语句返回记录集
自定义函数
诸多限制,有许多语句不能使用,许多功能不能实现
可以直接引用返回值
用表变量返回记录集
一、主体不同
1、函数:当需要分析数据清单中的数值是否符合特定条件时,使用数据库工作表函数。
2、存储过程:是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,一次编译后永久有效。
二、特点不同
1、函数:只能返回一个变量,可以嵌入sql中和存储过程中使用。
2、存储过程:用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
三、功能不同
1、函数:不能用临时表,只能用表变量,函数不能执行一组修改全局数据库状态的 *** 作。可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,所以在查询中位于from关键字后面。
2、存储过程:存储过程需要让sql的query可以执行,存储过程可以返回参数,如记录集。sql语句中不可以含有存储过程。
-Oracle存储过程
-数据库函数
该包用于 动态获取包中存储过程或者函数的参数。
create or replace package SF_GET_ARGUMENTS_PKG is
-- Author : SANFU
-- Created : 2020/7/22 14:40:49
-- Purpose : 动态获取包中存储过程或者函数的参数
PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2);
PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,
p_obj_name in VARCHAR2);
end SF_GET_ARGUMENTS_PKG;
/
create or replace package body SF_GET_ARGUMENTS_PKG is
/============================================
Author : CZH
Created : 2020-07-22 15:00:12
ALERTER :
ALERTER_TIME :
Purpose :
Arg_number : 2
P_PKG_NAME :包名
P_OBJ_NAME :存储过程名或函数名
============================================/
PROCEDURE get_arguments(p_pkg_name in VARCHAR2, p_obj_name in VARCHAR2) IS
v_pkg_name varchar2(100) := upper(p_pkg_name);
v_obj_name varchar2(100) := upper(p_obj_name);
v_arg_number NUMBER;
cursor data_cur is
select tPACKAGE_NAME,
tOBJECT_NAME,
tARGUMENT_NAME,
tIN_OUT,
count(tARGUMENT_NAME) over(PARTITION BY tOBJECT_NAME) arg_number,
row_number() over(partition by tOBJECT_NAME order by tPOSITION asc) rank_position
from sysuser_arguments t
where tPACKAGE_NAME = v_pkg_name
and tOBJECT_NAME = v_obj_name
and tPOSITION <> 0;
begin
select count(1)
into v_arg_number
from sysuser_arguments t
where tPACKAGE_NAME = v_pkg_name
and tOBJECT_NAME = v_obj_name
and tPOSITION <> 0;
dbms_outputput_line('/============================================');
dbms_outputput_line(' Author : SANFU');
dbms_outputput_line(' Created : ' ||
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
dbms_outputput_line(' ALERTER : ');
dbms_outputput_line(' ALERTER_TIME : ');
dbms_outputput_line(' Purpose : ');
dbms_outputput_line(' Obj_Name : ' || v_obj_name);
dbms_outputput_line(' Arg_Number : ' || v_arg_number);
for rec in data_cur loop
dbms_outputput_line(' ' || recARGUMENT_NAME || ' :');
end loop;
dbms_outputput_line(' ============================================/');
end get_arguments;
--获取参数
PROCEDURE pf_get_arguments(p_pkg_name in VARCHAR2,
p_obj_name in VARCHAR2) IS
v_pkg_name varchar2(100) := upper(p_pkg_name);
v_obj_name varchar2(100) := upper(p_obj_name);
v_attr varchar2(100);
cursor data_cur is
select tPACKAGE_NAME,
tOBJECT_NAME,
tARGUMENT_NAME,
tIN_OUT,
count(tARGUMENT_NAME) over(PARTITION BY tOBJECT_NAME) arg_number,
row_number() over(partition by tOBJECT_NAME order by tPOSITION asc) rank_position
from sysuser_arguments t
where tPACKAGE_NAME = v_pkg_name
and tOBJECT_NAME = v_obj_name
and tPOSITION <> 0;
begin
dbms_outputput_line(v_pkg_name || '' || v_obj_name || '(');
for rec in data_cur loop
if recin_out = 'IN' then
v_attr := '';
elsif recin_out = 'OUT' then
v_attr := '';
elsif recin_out = 'IN/OUT' then
v_attr := '';
end if;
if data_cur%ROWCOUNT = recarg_number then
dbms_outputput_line(lower(recARGUMENT_NAME) || ' =>' ||
' ' || v_attr || lower(recARGUMENT_NAME));
else
dbms_outputput_line(lower(recARGUMENT_NAME) || ' =>' ||
' ' || v_attr || lower(recARGUMENT_NAME) || ',');
end if;
end loop;
dbms_outputput_line(');');
end pf_get_arguments;
end SF_GET_ARGUMENTS_PKG;
/
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)