ITPub博客

首页 > 数据库 > 数据库开发技术 > PLSQL学习-【7存储过程、函数】

PLSQL学习-【7存储过程、函数】

原创 数据库开发技术 作者:哎呀我的天呐 时间:2014-11-24 12:48:25 0 删除 编辑



函数只能被调用不能单独执行。

先创建登陆人员的表。

23:34:31 SQL> create table login_tab(name varchar2(20) , login_date date);
Table created.


 SQL> create or replace procedure p_login

is
 begin
  insert into login_tab values(USER ,sysdate);
  commit;
 end;
/

SQL> exec p_login;


带参数的存储过程:

in 代表 传入的值
out 代表 返回的值
inout 代表传入的值处理后还是返给这个参数

01:15:53 SQL> create or replace procedure p_delete(p_empno in number)
01:16:36   2 is 
01:16:37   3 begin
01:16:44   4 delete from emp where empno = p_empno;
01:17:06   5   commit;
01:17:10   6 if sql%notfound then
01:17:26   7      dbms_output.put_line(\'not found\');
01:17:46   8 end if;
01:17:49   9 end;
01:17:55  10 /
Procedure created.


SQL> select * from user_objects;
OBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYP CREATED    LAST_DDL_TIME TIMESTAMP          STATUS  TEMPORARY GENERATED SECONDARY
-------------- ------------------------------ ---------- -------------- ---------- ----------- ------------- -------------------
PK_DEPT     51150     51150          INDEX      2005/10/22  2005/10/22 22 2005-10-22:22:23:19 VALID   N         N         N
DEPT        51149     51149          TABLE      2005/10/22  2005/10/22 22 2005-10-22:22:23:19 VALID   N         N         N
EMP         51151     51151          TABLE      2005/10/22  2005/10/22 22 2005-10-22:22:23:20 VALID   N         N         N
PK_EMP      51152     51152          INDEX      2005/10/22  2005/10/22 22 2005-10-22:22:23:20 VALID   N         N         N
BONUS       51153     51153          TABLE      2005/10/22  2005/10/22 22 2005-10-22:22:23:20 VALID   N         N         N
SALGRADE    51154     51154          TABLE      2005/10/22  2005/10/22 22 2005-10-22:22:23:20 VALID   N         N         N
LOGIN_TAB   55969     55969          TABLE      2014/11/23  2014/11/23 23 2014-11-23:23:35:20 VALID   N         N         N
P_LOGIN     55970                    PROCEDURE  2014/11/23  2014/11/23 23 2014-11-23:23:37:11 VALID   N         N         N
P_DELETE    55971                    PROCEDURE  2014/11/24  2014/11/24 1: 2014-11-24:01:17:57 VALID   N         N         N
P_1         55946                    PROCEDURE  2014/11/15  2014/11/15 10 2014-11-15:10:24:53 VALID   N         N         N
P_2         55947                    PROCEDURE  2014/11/15  2014/11/15 10 2014-11-15:10:35:58 VALID   N         N         N
P_3         55948                    PROCEDURE  2014/11/15  2014/11/15 10 2014-11-15:10:41:03 VALID   N         N         N
EMP1        55950     55950 TABLE               2014/11/15  2014/11/15 13 2014-11-15:13:12:05 VALID   N         N         N
TEST        55956     55956 TABLE               2014/11/21  2014/11/21 14 2014-11-21:14:45:32 VALID   N         N         N
QUERY_DEPT  55957                    PROCEDURE  2014/11/21  2014/11/21 17 2014-11-21:17:55:26 VALID   N         N         N
15 rows selected


SQL> select * from user_source;
NAME    TYPE    LINE  TEXT
------------------------------ ------------ ---------- -------------------------------------------------------------------------
P_LOGIN                        PROCEDURE             1 procedure p_login
P_LOGIN                        PROCEDURE             2 is
P_LOGIN                        PROCEDURE             3 begin
P_LOGIN                        PROCEDURE             4 insert into login_tab values(USER ,sysdate);
P_LOGIN                        PROCEDURE             5  commit;
P_LOGIN                        PROCEDURE             6 end;

删除存储过程:

SQL> drop procedure p_1;
Procedure dropped

例:删除测试数据库中无效的表。

01:50:06 SQL> create or replace procedure p_drop 
01:50:52   2 is
01:50:53   3      cursor cu_tab is
01:51:03   4      select * from tab where tname like 'TEST%' or (tname like 'EMP%' and length(tname)>3);
01:52:46   5 begin
01:52:50   6 for i in cu_tab loop
01:53:38   7      v_sql:='drop table :1';
01:54:59   8 execute immediate v_sql using i.tname;
01:55:22   9 end loop;
01:55:32  10 end;



这样不行。

这个才可以。

create or replace procedure p_drop 
 is
    cursor cu_tab is
      select * from tab where tname like 'TEST%' or (tname like 'EMP%' and length(tname) > 3); 
    v_sql varchar2(100);
begin
 for i in cu_tab loop
   dbms_output.put_line(i.tname);
    v_sql:='drop table '|| i.tname;
   execute immediate v_sql ;
  end loop;
end;
/


函数:
写一个函数,计算各部门的平均 工资,再写一个调用函数的匿名块。

create or replace function f_avg(p_deptno number)
  return number
  is
  v_avg number;
begin
   select trunc(avg(sal),) into v_avg from emp1 where deptno = p_deptno;
   return v_avg;
end;

declare 
  v_num number;
begin
  v_num:=f_avg(10);
  dbms_output.put_line(v_num);
end;

函数也可以通过user_source查看。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29990276/viewspace-1344402/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
https://cloud.tencent.com/developer/inventory/14362

注册时间:2014-10-30

  • 博文量
    403
  • 访问量
    2528689