当前位置:首页 » 存储配置 » 函数调用存储过程

函数调用存储过程

发布时间: 2023-08-14 14:24:22

1. 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 procere <过程名>(<参数列表,无参时忽略>)
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 procere 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 procere 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 al;-- 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;
/

2. oracle中函数和存储过程的区别和联系

在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点。刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别。
一、存储过程

1.定义

存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procere。

2.创建存储过程

create [or replace] procere 存储过程名

[(参数1 类型,参数2 out 类型……)]

as

变量名类型;

begin

程序代码体

end;

示例一:无参无返

create or replace procere p1
--or replace代表创建该存储过程时,若存储名存在,则替换原存储过程,重新创建
--无参数列表时,不需要写()
as
begin
dbms_output.put_line('hello world');
end;

--执行存储过程方式1
set serveroutput on;
begin
p1();
end;
--执行存储过程方式2
set serveroutput on;
execute p1();

示例二:有参有返

create or replace procere p2
(name in varchar2,age int,msg out varchar2)
--参数列表中,声明变量类型时切记不能写大小,只写类型名即可,例如参数列表中的name变量的声明
--参数列表中,输入参数用in表示,输出参数用out表示,不写时默认为输入参数。
------------输入参数不能携带值出去,输出参数不能携带值进来,当既想携带值进来,又想携带值出去,可以用in out
as
begin
msg:='姓名'||name||',年龄'||age;
--赋值时除了可以使用:=,还可以用into来实现
--上面子句等价于select '姓名'||name||',年龄'||age into msg from al;
end;
--执行存储过程
set serveroutput on;
declare
msg varchar2(100);
begin
p2('张三',23,msg);
dbms_output.put_line(msg);
end;

示例三:参数列表中有in out参数

create or replace procere p3
(msg in out varchar2)
--当既想携带值进来,又想携带值出去,可以用in out
as
begin
dbms_output.put_line(msg); --输出的为携带进来的值
msg:='我是从存储过程中携带出来的值';
end;

--执行存储过程
set serveroutput on;
declare
msg varchar2(100):='我是从携带进去的值';
begin
p3(msg);
dbms_output.put_line(msg);
end;

示例四:存储过程中定义参数

create or replace procere p4
as
--存储过程中定义的参数列表
name varchar(50);
begin
name := 'hello world';
dbms_output.put_line(name);
end;
---执行存储过程
set serveroutput on;
execute p4();

总结:1.创建存储过程的关键字为procere。

2.传参列表中的参数可以用in,out,in out修饰,参数类型一定不能写大小。列表中可以有多个输入输出参数。

3.存储过程中定义的参数列表不需要用declare声明,声明参数类型时需要写大小的一定要带上大小。

4.as可以用is替换。

5.调用带输出参数的过程必须要声明变量来接收输出参数值。

6.执行存储过程有两种方式,一种是使用execute,另一种是用begin和end包住。

存储过程虽然有很多优点,但是它却不能使用return返回值。当需要使用return返回值时,我们可以使用函数。

二、存储函数

1.函数与存储过程的结构类似,但是函数必须有一个return子句,用于返回函数值。

create or replace function f1
return varchar--必须有返回值,且声明返回值类型时不需要加大小
as
msg varchar(50);
begin
msg := 'hello world';
return msg;
end;

--执行函数方式1
select f1() from al;
--执行函数方式2
set serveroutput on;
begin
dbms_output.put_line(f1());
end;

三、存储过程与存储函数的区别和联系

相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数。

2.都是一次编译,多次执行。

不同点:1.存储过程定义关键字用procere,函数定义用function。

2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。

3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form al;)。

总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。

3. mysql存储过程怎么调用自定义函数

创建存储过程
mysql>
delimiter
$
--
delimiter
$是设置
$为命令终止符号,代替默认的分号,因为分号有其他用处.
mysql>
create
procere
sp_test(IN
pi_id
int,
OUT
po_name
varchar(10))
->
begin
->
select
*
from
test.tb_test;
->
select
tb_test.name
into
po_name
from
test.tb_test
where
tb_test.id
=
pi_id;
->
end
->
$
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
delimiter
;
--
恢复分号作为分隔终止符号
5.调用存储过程
mysql>
set
@po_name=';
Query
OK,
0
rows
affected
(0.00
sec)
mysql>
call
sp_test(1,@po_name);

4. sql数据库中的自定义函数可以调用存储过程

1)自定义函数中不能调用存储过程,如果调用了,函数可以顺利创建,但是调用函数会出错

2)自定义函数中不能创建表,删除表,插入表数据
解决办法:

可以先把存储过程返回的结果插入到临时表,然后在函数里调用临时表,或者运用内置函数,或者使用复杂的联合查询实现想要的结果

5. C语言 怎么 调存储过程

C语言里没有存储过程,只有函数,函数调用有两种方式
传值调用(call by value)和传址调用(call by reference)
例如
f1(x)
{
int a;
a=3*1-1;
f2(x,a);
return a+x;
}

f2(int r,int s)
{
int y;
y=2*r+1;
s=x*r;
r=s-y;
return;
}

f1中调用了f2函数,若第一个参数采用传值方式(无返回值,即f1中x=3 不变,只是把值传给f2使用而已)第二个参数采用传址方式(返回的是s的地址引用,即f1中a的值与f2中s的值相等)若x=3,则a+x=24

6. mysql 能通过函数调用 存储过程吗

mysql 能通过函数调用 存储过程
当然可以,也可以调用其他的函数或者自定义函数,当要看你MYSQL的版本哦

7. 创建存储过程和函数,调用存储过程和函数的区别

不同点:
1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。
2、函数中有返回值,且必须返回,而过程没有返回值。
3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。
4、函数可以在select语句中直接使用,而过程不能,例如:假设已有函数fun_getAVG() 返回number类型绝对值。那么select fun_getAVG(col_a) from table 这样是可以的。

相同点:
二者都可以有出参

8. sql server存储过程 中 如何调用函数

直接在存储过程中写函数名称啊,如果此函数有返回值的则定义一个变量接受,如果带有参数的函数则传递一个相同类型的参数过去啊。哎,这样说不知道你明白没。

9. 怎样从存储过程中调用函数

一,存储过程:
1、 在oracle的 配置和移植工具 àNET MANAGER中配置连接
2、 在plsql中新建SQL窗口,编写存储过程
3、 在plsql中新建测试窗口,在begin end之间调用
4、 查看编译错误:在命令窗口中show errors procere procere_name
或者 编辑的方式打开存储过程,在编译时会有错误提示

二,存储过程基本语法
create procere <过程名>(<参数列表,无参时忽略>)
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 procere 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 procere 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;

10. SQL Server 怎样在自定义函数里面调用存储过程

oracle在函数里可以添加关键字PRAGMA AUTONOMOUS_TRANSACTION 来让其支持自治事务,sqlserevr没用过不知道支不支持,楼主可以网络一下自治事务的用法,单从需求上来说,为什么一定要用函数,不可以写一个自定义的存储过程吗?

热点内容
安卓手机数字怎么变成红色 发布:2025-02-01 22:50:20 浏览:402
康佳29寸电视存储器坏怎么代换 发布:2025-02-01 22:40:44 浏览:188
访问的结果 发布:2025-02-01 22:30:12 浏览:176
cmd访问网站 发布:2025-02-01 22:02:45 浏览:441
清除svn缓存 发布:2025-02-01 22:01:04 浏览:946
安卓模拟器怎么用键盘操作 发布:2025-02-01 21:55:24 浏览:809
安卓手机屏幕为什么会变色 发布:2025-02-01 21:55:20 浏览:824
安卓存折怎么看余额 发布:2025-02-01 21:53:34 浏览:771
其他电脑怎么设置访问服务器 发布:2025-02-01 21:34:27 浏览:896
如何敲编程 发布:2025-02-01 21:26:13 浏览:25