1.区别联系:

存储过程:没有直接返回值,主要用于执行操作。
函数:返回一个值,主要用于计算并返回一个值。

2.示例表结构

关于上述用到的page_books表的相关信息如下图

存储过程与函数 - 图1

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