注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle、MySQL资料及经验

.

 
 
 

日志

 
 

MySQL与Oracle存储过程比较(转)  

2015-12-28 17:37:07|  分类: MySQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、不带参数
1. 输出一句话:hello world
delimiter //  
create procedure p_first() 
BEGIN
select "Hello World";
END
 //  
delimiter ;  

调用:call test.p_first;


2. 输出某个变量
定义:
delimiter //  
 create procedure p1()  
 begin   
  declare v_ename varchar(10);  
  declare v_sal   int;   
      select ename,sal into v_ename,v_sal from emp where empno=7788;      
      select v_ename ;  
      select v_sal;  
  end;  
 //  
delimiter ;  

调用:
call p1();
call p1;


二、in参数
delimiter //  
create procedure p2(in v_empno int)  
    begin   
     declare v_ename varchar(10);  
     declare v_sal   int;   
         select ename,sal into v_ename,v_sal from emp where empno=v_empno;      
         select v_ename ;  
         select v_sal;  
     end;  
//  
delimiter ;  

调用:call p2(7788);


三、out参数
delimiter //  
create procedure p3(in v_empno int,out v_sal int)  
    begin   
     declare v_ename varchar(10);   
         select ename,sal into v_ename,v_sal from emp where empno=v_empno;      
         select v_ename ;  
         select v_sal;  
     end;  
//  
delimiter ;  

调用:call p3(7788,@v_sal);


四、循环
1. while 循环
delimiter //  
create procedure p_while()  
begin  
declare v_empno int;  
declare v_count int;  
       set  v_empno=7788;  
       set  v_count=1;  
       while v_count <= 10 do  
             insert into emp1 select * from emp where empno=v_empno;  
         set  v_count=v_count + 1;  
         end while;  
         end;  
//  
delimiter ;  


repeat、for跟while的步长有差别,注意区别使用。

2. repeat 循环:
delimiter //  
create procedure p_repeat()  
begin  
declare v_empno int;  
declare v_count int;  
       set  v_empno=7788;  
       set  v_count=1;  
       repeat  
             insert into emp1 select * from emp where empno=v_empno;  
         set  v_count=v_count + 1;  
         until v_count > 10  
         end repeat;  
         end;  
//  
delimiter ;  


3. loop 循环:
delimiter //  
create procedure p_loop()  
begin  
declare v_empno int;  
declare v_count int;  
       set  v_empno=7900;  
       set  v_count=1;  
       loop_label:loop  
             insert into emp1 select * from emp where empno=v_empno;  
         set  v_count=v_count + 1;  
         if v_count > 10 then  
         leave loop_label;  
         end if;  
         end loop;  
         end;  
//  
delimiter ; 


Oracle 存储过程

不带参数:
SQL> create or replace procedure proc1 is  
  v_ename emp.ename%type;  
  v_sal  emp.sal%type ;  
    
  begin  
     select ename,sal into v_ename,v_sal from emp where empno=&no;  
      dbms_output.put_line('Name is : '||v_ename||' , '||'Salary is : '||v_sal);  
  exception  
      when no_data_found then  
         dbms_output.put_line('you number is not crrect ,please input again !');  
    
  end;  
/  
Procedure created
执行:
SQL> exec proc1;
 
PL/SQL procedure successfully completed
 
SQL> set serverout on
SQL> /
 
Name is : SCOTT , Salary is : 3000
 
PL/SQL procedure successfully completed



带参数的存储过程:
参数定义中,IN、OUT和IN OUT代表参数的三种不同模式: 
IN:当调用存储过程时,该模式的形参接收对应实参的值,并且该是只读的,即不能被修改。默认为IN。
OUT:该形参被认为只能写,既只能为其赋值。在存储过程中不能读它的值。返回时,将该形参值传给相应的实参。 
IN OUT:都允许

in 参数:
SQL>  create or replace procedure proc2 ( v_empno emp.empno%type) is      -- 如果不指明参数的模式,默认为in  
      v_ename emp.ename%type;  
      v_sal emp.sal%type;  
    
      begin  
         select ename,sal into v_ename,v_sal from emp where empno=v_empno;  
         dbms_output.put_line('Name is : '||v_ename||' , '||'Salary is : '||v_sal);  
      exception  
          when no_data_found then  
             dbms_output.put_line('you number is not crrect ,please input again !');  
    
     end;  
 /  
Procedure created  
执行: 
SQL> exec proc2(7369);
 
Name is : SMITH , Salary is : 8000
 
PL/SQL procedure successfully completed
 

SQL> create or replace procedure proc2 ( v_empno in emp.empno%type) is  
      v_ename emp.ename%type;  
      v_sal emp.sal%type;  
    
      begin  
         select ename,sal into v_ename,v_sal from emp where empno=v_empno;  
         dbms_output.put_line('Name is : '||v_ename||' , '||'Salary is : '||v_sal);  
     exception  
          when no_data_found then  
             dbms_output.put_line('you number is not crrect ,please input again !');  
    
     end;  
  /  

out 参数:
SQL> create or replace procedure proc2 ( v_empno in emp.empno%type, v_ename out emp.ename%type,v_sal out emp.sal%type)  
   is  
    
  begin  
     select ename,sal into v_ename,v_sal from emp where empno=v_empno;  
     dbms_output.put_line('Name is : '||v_ename||' , '||'Salary is : '||v_sal);  
  exception  
      when no_data_found then  
        dbms_output.put_line('you number is not crrect ,please input again !');  
    
  end;  
 /  
Procedure created  
 执行:
SQL> var v_ename varchar2(10);
SQL> var v_sal number;                              //注意:对于number类型不能指明长度
SQL> exec proc2(7788,:v_ename,:v_sal );
 
Name is : SCOTT , Salary is : 3000
 
PL/SQL procedure successfully completed
v_ename
---------
SCOTT
v_sal
---------
3000

通过匿名块执行:
SQL> var v_ename varchar2
SQL> var v_sal number
SQL> declare
  v_empno emp.empno%type := 7788;
  begin
    proc2(v_empno ,:v_ename,:v_sal);
  end;
 /
 
Name is : SCOTT , Salary is : 3000
 
PL/SQL procedure successfully completed
v_ename
---------
SCOTT
v_sal
---------
3000
 
SQL> declare
    v_empno emp.empno%type := 7836;
    v_ename emp.ename%type ;
   v_sal emp.sal%type;
 begin
    proc2(v_empno ,v_ename,v_sal);
 end;
 /

in out 参数:
SQL>create or replace procedure proc3( v_empno  in out emp.empno%type)  
 is   
 v_ename emp.ename%type;  
 v_sal emp.sal%type;  
   
 begin  
     select ename,sal into v_ename,v_sal from emp where empno=v_empno;  
   dbms_output.put_line('Name is : '||v_ename||' , '||'Salary is : '||v_sal);  
exception  
    when no_data_found then  
       dbms_output.put_line('you number is not crrect ,please input again !');       
end;  
/  
执行:
SQL> var v_empno number;
SQL> exec :v_empno:=7788;
 
PL/SQL procedure successfully completed
v_empno
---------
7788
 
SQL> exec proc3(:v_empno);
 
Employees id is: 7788 , Name is : SCOTT , Salary is : 3000
 
PL/SQL procedure successfully completed
v_empno
---------
7788

SQL> declare
  v_empno emp.empno%type;
  begin
   v_empno:=7788;
   proc3(v_empno );
  end;
 /
 
Name is : SCOTT , Salary is : 3000
 
PL/SQL procedure successfully completed


SQL> create or replace procedure proc3( v_empno  in out emp.empno%type)     
   is    
   v_ename emp.ename%type;  
   v_sal emp.sal%type;  
    
 begin  
     select empno,ename,sal into v_empno, v_ename,v_sal from emp where empno=v_empno;  
     dbms_output.put_line('Employee number is: '||v_empno||' , '||'Name is : '||v_ename||' , '||'Salary is : '||v_sal);  
  exception  
      when no_data_found then  
         dbms_output.put_line('you number is not crrect ,please input again !');  
    
  end;  
 /  
   
Procedure created  
 
执行:
SQL> declare
  v_empno emp.empno%type;
  begin
    v_empno := 7788;
  proc3(v_empno);
  end;
 /
 
Employee number is: 7788 , Name is : SCOTT , Salary is : 3000
 
PL/SQL procedure successfully completed




Oracle 存储过程循环:

loop 基本循环:
SQL>  declare  
      v_empno emp.empno%type := 7788;  
      v_count number :=0;  
    
    begin  
    
      loop  
         insert into emp1 select * from emp where empno=v_empno;  
         v_count := v_count + 1;  
         exit when  v_count >= 10;  
      end loop;  
    
    end;  
/  
   
PL/SQL procedure successfully completed  

for 循环:
SQL> declare  
     v_empno emp.empno%type;  
    
    begin  
       v_empno := 7788;  
    
     for  i  in 1..10 loop  
         insert into emp1 select * from emp where empno=v_empno;  
     end loop;      
   end;           
 /  
   
PL/SQL procedure successfully completed  


while 循环:
SQL> declare  
      v_empno emp.empno%type;  
      v_count number := 0;  
    
    begin  
       v_empno := 7788;  
    
      while v_count < 10  loop  
         insert into emp1 select * from emp where empno=v_empno;  
         v_count := v_count + 1;  
    
      end loop;  
      end;  
 /  
   
PL/SQL procedure successfully completed  

参考原文:http://blog.csdn.net/lqx0405/article/details/50238181


  评论这张
 
阅读(49)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017