1.区别联系:
存储过程:没有直接返回值,主要用于执行操作。
函数:返回一个值,主要用于计算并返回一个值。
2.示例表结构
关于上述用到的page_books表的相关信息如下图
3.存储过程
1)创建语法
CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_name [IN | OUT | IN OUT] type [, …])]
{IS | AS}
BEGIN
< procedure_body >
END;
/
2)创建有参存储过程
CREATE PROCEDURE addBook(title in varchar2,price in number,author in varchar2,pt in date)
AS
BEGIN
insert into page_books (title,price,author,publish_date) values(title,price,author,pt);
END;
/
调用有参存储过程
- 方式一
DECLARE
title page_books.title%type := ‘title18’;
price page_books.price%type := 50.55;
author page_books.author%type := ‘author18’;
pt page_books.publish_date%type := sysdate;
BEGIN
addBook(title,price,author,pt);
END;
/
- 方式二
EXECUTE addBook(‘book19’,100,’author19’,sysdate);
3)例:创建无参存储过程
CREATE PROCEDURE sayHello
IS
BEGIN
DBMS_OUTPUT.put_line(‘Hello!’);
END;
/
调用无参存储过程
- 方式一
BEGIN
sayHello();
END;
/ - 方式二
BEGIN
sayHello;
END;
/ - 方式三
EXECUTE sayHello;
-方式四
EXECUTE sayHello();
4) 创建存储过程的一些小细节
- 无参存储过程定义时存储过程名后面一定不能加括号!!!报错:Warning: Function created with compilation errors
- 无参存储过程调用时可以加括号也可以不用加,可以通过PL/SQL调用,也可以通过execute关键字调用
- 有参存储过程的参数类型一定不能指定精度!!!否则报错:Warning: Procedure created with compilation errors
- 利用 表名.字段%type 可以取到表中某个字段的具体类型,方便给我们声明的变量时设置它的类型 如 price page_books.price%type;
- 利用PL/SQL DEVELOPER工具执行存储过程时,如果存储过程中有输出内容想要看到,必须先执行下面的命令:
set serveroutput on;
4.函数:
1)创建有参函数
CREATE FUNCTION mul(x in double precision,y in double precision)
RETURN double precision
IS
result double precision;
BEGIN
result := x*y;
RETURN result;
END;
/
调用有参函数
DECLARE
a double precision;
BEGIN
a:=mul(2,10);
DBMS_OUTPUT.put_line(a);
END;
/2)创建无参函数
CREATE FUNCTION totalBooks
RETURN number
IS
totalBooks number;
BEGIN
select count(id) INTO totalBooks from page_books;
RETURN totalBooks;
END;
/
调用无参函数
DECLARE
a number;
BEGIN
a:=totalBooks();
DBMS_OUTPUT.put_line(totalBooks);
END;
/
5.is与as有什么区别?
- 在存储过程与函数中,is与as没有任何区别
- 在视图中只能用as,在游标中只能用is
原文链接:https://blog.csdn.net/cccmercy/article/details/78867353