大白糖奶兔的Blog
大白糖奶兔的Blog
数据库第八章-存储过程

数据库编程

  • 函数
  • 存储过程
  • 触发器

案例一

根据供应商号在S表中删除指定供应商信息

create or replace procedure delete_s(p_sno char(2))
language 'plpgsql'
as $$
declare
    begin
        if exists(select * from s where sno=p_sno) then
            delete from s where sno=p_sno;
            commit;
            raise notice '删除供应商成功!';
        else
            raise notice '没有这个供应商号!删除失败!';
        end if;
    end;
$$;

存储过程只需要他去做事,不需要返回什么信息,做完之后只需要告诉我是否成功即可

https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_9c0f16d28f093d24efb59a7e80d6f5de.jpg

失败的测试

https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_4ebac65df0c31373db55b28fb2a66d09.jpg

成功不测试了
算了还是试一下吧

insert into s (sno)
values('S8');

https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_3455c9a7de6f471d4e51756fc52ced30.jpg

https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_190e63a06209782cc1ee0735ca0c7563.jpg

call delete_s('S8');
https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_80a5f98bf89a3889ef20da28227187d5.jpg

案例二

插入数据

create or replace procedure insert_s(p_sno char(2),p_sname char(6),p_status char(2),p_city char(4))
language 'plpgsql'
as $$
    begin
        if not exists (select * from s where sno=p_sno) then
            insert into s values(p_sno,p_sname,p_status,p_city);
            commit;
            raise notice '插入数据成功!';
        else
            raise notice '该供应商已存在,插入失败!';
        end if;
    end;
$$;
https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_038a3a0a6ad6ced1c278e497d08bdfde.jpg

测试

call insert_s('S8','sgf','20','pk');
https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_3b6171f71c842ac0fb43b7e2b074b834.jpg
https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_e91834f2c8cf68c645353f062bbe6706.jpg
https://yczbest.cn/wp-content/uploads/2020/08/wp_editor_md_17a6586a8b5ac6c33fb378cb94a5bc2d.jpg

函数和存储过程的相同点与不同点

不同点

  • 函数里不能使用raise notice
  • 函数里必须有返回值,没有返回值用return void,存储过程没有返回值
  • 函数中判断元组有无用is null,存储过程用if exists

相同点

  • 给定参数返回一个数据使用函数
  • 如果根据参数对表进行一系列操作用存储过程,不返回数据

直接使用存储过程和函数简化了操作,省去了编译过程,加快了前后端的响应速度,比直接使用SQL语句要效率高一些

发表评论

textsms
account_circle
email

大白糖奶兔的Blog

数据库第八章-存储过程
数据库编程 函数 存储过程 触发器 案例一 根据供应商号在S表中删除指定供应商信息 create or replace procedure delete_s(p_sno char(2)) language 'plpgsql' as $$ declare be…
扫描二维码继续阅读
2020-08-19
Title - Artist
0:00