存储过程基本函数?存储过程和函数的区别
一、SQL函数和存储过程的区别
不同点:
1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。
2、函数中有返回值,且必须返回,而过程可以没有返回值。
3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。
4、函数可以在select语句中直接使用实现对字段进行计算,而存储过程不能,
例如:假设已有函数fun_get**G()返回number类型绝对值。
那么select fun_get**G(col_a) from table这样是可以的。
5、函数一般处理简单的逻辑方便,存储过程一般处理复杂的逻辑,
相同点:
1、二者都可以有输出
2、二者写法逻辑上很相似
二、存储过程和函数的区别
一、含义不同
1、存储过程:存储过程是 SQL语句和可选控制流语句的预编译**,以一个名称存储并作为一个单元处理。
2、函数:是由一个或多个 SQL语句组成的子程序,可用于封装代码以便重新使用。函数限制比较多,如不能用临时表,只能用表变量等
二、使用条件不同
1、存储过程:可以在单个存储过程中执行一系列 SQL语句。而且可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
2、函数:自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的*作。
三、执行方式不同
1、存储过程:存储过程可以返回参数,如记录集,函数只能返回值或者表对象。存储过程的参数有in,out,inout三种,存储过程声明时不需要返回类型。
2、函数:函数参数只有in,而函数需要描述返回类型,且函数中必须包含一个有效的return语句。
参考资料链接:百度百科-存储过程
参考资料链接:百度百科-函数
三、函数和存储过程的区别
函数和存储过程对SQL SERVER来说有很大的区别:
1.在SQL SERVER2K以前,没有自定义函数UDF,只有系统函数。
2.无论系统函数和UDF,在系统启动是就进行编译并加载,所以UDF的效率比SP要高,SP只是在调用时才加载(扩展的存储过程除外)。
3.有些函数getdate,exec..都在UDF里不能用!
4.函数必须有返回值,SP则不一定。
5.函数可以包括在FROM子句中,SP则不可以。
6.在SQL SERVE2K中SP可以DEBUG,UDF不可以。用户定义函数
函数是由一个或多个 Transact-SQL语句组成的子程序,可用于封装代码以便重新使用。Microsoft® SQL Server™ 2000并不将用户限制在定义为 Transact-SQL语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用 CREATE FUNCTION语句创建、使用 ALTER FUNCTION语句修改、以及使用 DROP FUNCTION语句除去用户定义函数。每个完全合法的用户定义函数名(database_name.owner_name.function_name)必须唯一。
必须被授予 CREATE FUNCTION权限才能创建、修改或除去用户定义函数。不是所有者的用户在 Transact-SQL语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。若要创建或更改在 CHECK约束、DEFAULT子句或计算列定义中引用用户定义函数的表,还必须具有函数的 REFERENCES权限。
在函数中,区别处理导致删除语句并且继续在诸如触发器或存储过程等模式中的下一语句的 Transact-SQL错误。在函数中,上述错误会导致停止执行函数。接下来该*作导致停止唤醒调用该函数的语句。
用户定义函数的类型
SQL Server 2000支持三种用户定义函数:
标量函数
内嵌表值函数
多语句表值函数
存储过程
存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL语句和可选控制流语句的预编译**,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用 SQL语句的目的来使用存储过程,它具有以下优点:
可以在单个存储过程中执行一系列 SQL语句。
可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL语句快。存储过程可能单独完成一些内容,可以单独进行。
函数可以在试子中调用,比如可以进行一些计算等,不能单独执行。
四、1,存储过程和函数的区别
存储过程和函数目的是为了可重复地执行*作数据库的sql语句的**。
区别是写法和调用上。
写法上:存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数;
函数的参数列表只有输入参数,并且有return<返回值类型,无长度说明>。
返回值上:
存储过程的返回值,可以有多个值,
函数的返回值,只有一个值。
调用方式上:
存储过程的调用方式有:
1)、exec<过程名>;
2)、execute<过程名>;
3)、在PL/SQL语句块中直接调用。
函数的调用方式有:
在PL/SQL语句块中直接调用。
具体分为:
----调用FUNCTION add_three_numbers
----1.位置表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(2,4,5));
END;
----2.命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));
END;
----3.混合使用位置表示法和命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));
END;
----4.排除表示法
BEGIN
dbms_output.put_line(add_three_numbers(12,c=>2));
END;
----5. sql调用表示法--混合表示法
SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;
----1.该函数接受3个可选参数,返回3个数字的和
CREATE OR REPLACE FUNCTION add_three_numbers
(
a NUMBER:=0, b NUMBER:=0, c NUMBER:=0
)
RETURN NUMBER IS
BEGIN
RETURN a+b+c;
END;
存储过程:
基本语法:
create procedure<过程名>(<参数列表,无参时忽略>)
as|is
变量声明、初始化
begin
业务处理、逻辑代码
exception
异常捕获、容错处理
end<过程名>;
参数:<参数名> in|out|in out<参数类型,无长度说明>,如:v_name varchar2
in:入参
out:出参
in out:出入参
注:as|is表示as或is
调用语法:
1)、exec<过程名>;
2)、execute<过程名>;
3)、在PL/SQL语句块中直接调用。
例:
create or replace procedure up_wap(v_param1 in out varchar2,v_param2 in out varchar2)
is
v_temp varchar2(20);
begin
dbms_output.put_line('交换前参数1:'||v_param1||'参数2:'||v_param2);
v_temp:=v_param1;
v_param1:=v_param2;
v_param2:=v_temp;
dbms_output.put_line('交换后参数1:'||v_param1||'参数2:'||v_param2);
exception
when others then dbms_output.put_line('There is a error when the procedure up_wap executing!');
end up_wap;
/
--调用存储过程
declare
v_param1 varchar2(20):='param1';
v_param2 varchar2(20):='param2';
begin
up_wap(v_param1=> v_param1,v_param2=> v_param2);
end;
/
自定义函数(function)
基本语法:
create function<函数名>(<参数列表,无参时忽略>)
return<返回值类型,无长度说明>
as|is
变量声明、初始化
begin
业务处理、逻辑代码
return<返回的值>;
exception
异常捕获、容错处理
end<函数名>;
参数:in入参
注:只有入参的类型。
在存储过程和自定义函数中的参数的传递(入参和出参)不能使用%type或%rowtype匹配,不能使用空值null,但是存储过程可以返回空值。
例:
create function uf_select_name_by_id_test(v_id in number)
return varchar2
is
v_name t_test.t_name%type;
begin
select t_name into v_name from t_test where t_id=v_id;
return v_name;
exception
when others then dbms_output.put_line('error');
end uf_select_name_by_id_test;
/
select uf_select_name_by_id_test(1)姓名 from dual;-- select调用
declare--pl/sql语句块调用
v_name varchar2(20);
begin
v_name:=uf_select_name_by_id_test(1);
dbms_output.put_line('name='||v_name);
end;
/