存储过程和函数

在plsql 中 sql 窗口 书写 ,执行, 后在 all objects 窗口 procedures可以进行测试。

一存储过程实例1:

create or replace procedure area(v_zdbh in zk_fxxx.zdbh%type, v_nsrsbh out zk_fxxx.nsrsbh%type)
 is
begin
    select nsrsbh into v_nsrsbh  
    from zk_fxxx
    where zdbh = v_zdbh;
end area;

实例2:

create or replace procedure test(ag in  number) is
begin
  if ag >15 then
    begin
      update employ  set
        education ='高中'
        where age = ag;  
      end;
  end if; 
  if ag <=15 then 
    begin
      update employ set
      education ='初中'
      where age =ag;
    end;
    end if; 
end test;

实例3:

create or replace procedure zdrk (zdbh in varchar2 ,zdlx in char, bh in zk_jz_fxxx.jf_lsh%type )  ---varchar(8)  有误不能加(8)
  is
  i number :=0;
  j zk_fxxx.srsbh%type :='';
  n number(8);
 begin
    n  := zdbh;
    loop
     delete from  zk_fxxx t
     where t.zdbh = to_char( zdbh,'xxxxxxxxx');
     if  i > zdbh+10 then
       exit;
       end if;
    end loop;
 end  zdrk;

mysql navicat 下  有关游标的

简单 存储过程实例
  BEGIN
     DECLARE temp INT;
     DECLARE name VARCHAR(30);
     SET temp = idbegin;
     SET name = '存储过程测试';
     WHILE temp <= idend
    DO 
       INSERT INTO test_name VALUES(temp,name);
       SET temp = temp+1;
    END WHILE;
END

实例2
BEGIN
    #Routine body goes here...

  DECLARE tempid INT DEFAULT 0;  
  DECLARE tempname VARCHAR(30) default '';
  DECLARE cur CURSOR FOR SELECT id, name from test_name  WHERE id> 2; -- 游标声明位置 变量之后 异常志强

   /*  
    02000 发生下述异常之一:   
    SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。   
    在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。   
    在 FETCH 语句中引用的游标位置处于结果表最后一行之后。   
    */  
    declare CONTINUE HANDLER FOR SQLSTATE '02000' set tmp = 0;  
     -- declare CONTINUE HANDLER FOR NOT FOUND set tempid = 0;    亦可以  

  OPEN cur;            -- 打开游标
  FETCH cur INTO tempid, tempname;   -- 从游标获取 值  

  WHILE  tempid!=0
   DO 
     SELECT  tempid, tempname;      -- 打印 值  分多个结果显示

     UPDATE test_name SET name = CONCAT(tempid,'号',tempname) 
     WHERE id = tempid;
     FETCH cur INTO tempid, tempname;
   END WHILE;
   CLOSE cur;    -- 关闭游标 
END


存储过程

  1  CREATE OR REPLACE PROCEDURE 存储过程名

   IS

   BEGIN

  4  NULL;

   END;

行1:

  CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;

行2:

  IS关键词表明后面将跟随一个PL/SQL体。

行3:

  BEGIN关键词表明PL/SQL体的开始。

行4:

  NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;

行5:

  END关键词表明PL/SQL体的结束

存储过程创建语法:

 create or replace procedure 存储过程名(param1 in typeparam2 out type) 

as 

变量1 类型(值范围); --vs_msg   VARCHAR2(4000); 

变量2 类型(值范围);

Begin

Select count(*) into 变量1 from 表A where列名=param1

    If (判断条件) then

       Select 列名 into 变量2 from 表A where列名=param1

       Dbms_outputPut_line(‘打印信息’);

    Elsif (判断条件) then

       Dbms_outputPut_line(‘打印信息’);

    Else

       Raise 异常名(NO_DATA_FOUND;

    End if;

Exception

    When others then

       Rollback;

End;

注意事项:

1, 存储过程参数不带取值范围,in表示传入,out表示输出

类型可以使用任意Oracle中的合法类型。

2,  变量带取值范围,后面接分号

3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录

4,  用select 。。。into。。。给变量赋值

5,  在代码中抛异常用 raise+异常名

 

CREATE OR REPLACE PROCEDURE存储过程名
(

--定义参数
 is_ym  IN CHAR(6) ,

the_count OUT NUMBER,

AS 
--定义变量 
vs_msg   VARCHAR2(4000);   --错误信息变量
vs_ym_beg  CHAR(6);      --起始月份
vs_ym_end  CHAR(6);      --终止月份
vs_ym_sn_beg CHAR(6);     --同期起始月份
vs_ym_sn_end CHAR(6);     --同期终止月份

--定义游标(简单的说就是一个可以遍历的结果集) 


CURSOR cur_1 IS 
  SELECT 。。。 
  FROM 。。。 
    WHERE 。。。
   GROUP BY 。。。; 

BEGIN 


函数实例:

create or replace function xx (id in zk_fxxx.zdbh%type )
 return char
 is
 dw_dm  zk_jz_fxxx.dw_dm%type := '';
  begin
    select dw_dm into dw_dm  from zk_fxxx where zdbh = id;
  return dw_dm;
  end xx ;







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值