Capítulo 7 Procedimiento almacenado

1 Introducción a los procedimientos almacenados

        Un procedimiento almacenado es un conjunto de sentencias SQL almacenadas en el servidor de la base de datos, que se ejecutan llamando a un nombre específico en la consulta, al igual que una función que encapsula un conjunto de comandos. Estos comandos se ejecutan cuando se llama al nombre de la función

 

2 ventajas de los procedimientos almacenados

(1) Mejorar la función y la flexibilidad del lenguaje SQL : los procedimientos almacenados se pueden escribir con declaraciones de control, lo que tiene una gran flexibilidad y puede completar juicios complejos y cálculos más complejos.

(2) Programación de componentes estándar : después de que se crea el procedimiento almacenado, se puede llamar varias veces en el programa sin tener que volver a escribir la declaración SQL del procedimiento almacenado. Y los profesionales de bases de datos pueden modificar el procedimiento almacenado en cualquier momento sin afectar el código fuente de la aplicación.

(3) Velocidad de ejecución más rápida : si una operación contiene una gran cantidad de código Transaction-SQL o se ejecuta varias veces, la velocidad de ejecución del procedimiento almacenado es mucho más rápida que la del procesamiento por lotes. Porque el procedimiento almacenado está precompilado. Al consultar un procedimiento almacenado por primera vez, el optimizador lo analiza y optimiza, y proporciona un plan de ejecución que finalmente se almacena en la tabla del sistema. Sin embargo, las instrucciones de Transaction-SQL por lotes deben compilarse y optimizarse cada vez que se ejecutan, y la velocidad es relativamente lenta.

(4). Reducir el tráfico de red: para operaciones en el mismo objeto de base de datos (como consulta y modificación), si la instrucción Transaction-SQL involucrada en esta operación está organizada en un procedimiento almacenado, entonces cuando el procedimiento almacenado se llama en el cliente computadora, solo la declaración de llamada se transmite en la red, lo que reduce en gran medida el tráfico de red y reduce la carga de la red.

(5) Aprovecharlo al máximo como mecanismo de seguridad: al restringir la autoridad para ejecutar un procedimiento almacenado, se puede restringir la autoridad de acceso a los datos correspondiente, evitando el acceso de usuarios no autorizados a los datos y garantizando la Seguridad de los datos.

 

3 Cree una sintaxis de procedimiento almacenado

语法
CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体
DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //
DELIMITER ;

分隔符
MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。

参数
存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:
IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT:该值可在存储过程内部被改变,并可返回
INOUT:调用时指定,并且可被改变和返回

过程体
过程体的开始与结束使用BEGIN与END进行标识。 

4 Operación básica

-- 存储过程 

/**
创建存储过程,并不代表执行存储过程
*/

delimiter //
create
   
    procedure test()
    begin
	insert into a values (null,'11');
	insert into a values (null,'33');
	insert into a values (null,'99');
	insert into a values (null,'11');
    end//
    
delimiter ;

-- 执行调用存储过程
call test();


-- 有输入参数的存储过程
/*
test2(参数。。)   in或者out,inout  参数名字 参数的类型
添加多个参数用,隔开  参数类型可以一样,但是名字要不一样。
*/
delimiter //
create
   
    procedure test2(in number2 varchar(22),number1 varchar(22))
    begin
	insert into a values (null,number1);
    end//
    
delimiter ;

call test2('张三','李四');


-- 有输出参数的存储过程
delimiter //
create
   
    procedure test3(out number int)
    begin
	select count(*)into number from a;
    end//
    
delimiter ;

-- 调用该存储过程    输出参数number的值,保存在aa中
call test3(@aa);

-- 查看aa的值
select @aa;



-- 有输出和输入参数的存储过程
delimiter //
create
   
    procedure test4(message varchar(22),out number int)
    begin
	select count(*)into number from a;
	insert into a values(null,message);
    end//
    
delimiter ;

-- 调用存储过程
call test4('admin',@number);

select @number;



/*****************控制流************/
-- 变量
/*
变量 : 会变的程度
变:变化
量:程度

1 定义
2 赋值

*/

-- if
/**
number 1 在a 表中a_name 就为张三
number 2 在a 表中a_name 就为李四
number 3 在a 表中a_name 就为王武
nubmer为其他数字,就添加aa
*/
delimiter //
create
   
    procedure test5(number int )
    begin
	if number=1   then 
	    insert into a values (null,'张三');
	elseif number=2   then 
	    insert into a values (null,'李四');
	elseif number=3   then 
	    insert into a values (null,'王武');   
	else  
	    insert into a values (null,'aa');	
	end if;	
    end//
delimiter ;

-- 调用存储过程
call test5(44);


--  变量  1 declare  message  varchar(22); 
delimiter //
create
    procedure test6(number int )
    begin
	
	/*声明变量   保存值
	*/
	declare  message  varchar(22); 
	if number=1  then 
		/**赋值*/
	    set message ='张三';
	elseif number=2   then 
	    set message ='李四';
	elseif number=3   then 
	     set message ='王武';
	else  
	   set message ='aa';	
	end if;	
	insert into a values (null,message);	
    end//
delimiter ;


call test6(3);



--  变量  2set @message ='张三';
delimiter //
create
    procedure test7(number int )
    begin

	if number=1  then 
		/**赋值*/
	    set @message ='张三';
	elseif number=2 then 
	    set @message ='李四';
	elseif number=3 then 
	     set @message ='王武';
	else  
	   set @message ='aa';	
	end if;	
	insert into a values (44,@message);	
    end//
delimiter ;

-- 调用
call test7(1);



-- case语句  
delimiter //
create
    procedure test8(number int )
    begin
	case  
	when number =1 then  
	    set @message ='张三';
	    
	when  2 then  
	    set @message ='李四';
	when  3 then  
	    set @message ='王武';
	else  
	    set @message ='aa';
	end case;
	
	insert into a values (44,@message);	
    end//
delimiter ;

call test8(33);


--  循环  LOOP_LABLE
delimiter //
create
    procedure test9( )
    begin
      declare v int default 1;	
     LOOP_LABLE:loop 
      set v=v+1;
      /*打印*/
      select concat('v=',v);
      if v >10 then 
      leave LOOP_LABLE;  
      end if;  
     end loop;		
    end//
delimiter ;

call test9();

Supongo que te gusta

Origin blog.csdn.net/yipianfeng_ye/article/details/90636507
Recomendado
Clasificación