간단한 예 [MySQL이] 파라미터 송신 파라미터를 전달 매개 변수없이 저장 프로 시저의 동적 SQL

데이터베이스 데이터의 모든 모양의 첫번째 1,

 

 

 2, 매개 변수 저장되지 절차

- (1)에서 MySQL 세퍼레이터 세트 및 
DELIMITER 
- 2. 삭제 저장된 프로 시저 PROC1 있으면 
드롭  PROCEDURE  는 IF가  EXISTS proc1` ' 
- 3. 프로 시저가 정의 (NO 참조) 
(가) CREATE  PROCEDURE의 (PROC1)를 
     시작 
    - 4. 특정 SQL 수행 
    은 SELECT  COUNT ( *를 ) 로부터 T1 T 를 Where t.name 에서 LIKE  ' % 1 %. ' ,
     단부 
    - (5)의 단부 
    
- 제의 MySQL에서 세퍼레이터 세트, 
분리,
 - - 7. 저장 프로 시저 호출 
통화 PROC1은 ();
 -PROC1 8. 저장 프로 시저가 삭제되면 존재 
드롭  PROCEDURE  는 IF가  EXISTS PROC1은;

 

 

 3, 매개 변수 전달

- (1)에서의 MySQL 세퍼레이터 세트 및 
DELIMITER 
- (2) 삭제 된 프로 시저가 있으면 PROC1 
드롭  PROCEDURE  는 IF가  EXISTS proc1` ' 
- 3. 정의 프로 시저 (수신 매개 변수 문자열 유형) 
생성  PROCEDURE PROC1 ( IN N- CHAR ) 
     (가) BEGIN 
    - 특정 SQL을 수행하는 제 
    은 SELECT  COUNT를 ( * ) FROM T1 T 를 Where t.name 에서 LIKE CONCAT ( ' % ' , N-, ' % ' ),
     엔드 
    - (5)의 단부 
    
- 제의 MySQL 세퍼레이터; 설정; 
DELIMITER]
 - 7. 설정 변수 
집합을  @name = ' . 1 ' ]
 - 파라미터를 전달하는 제 프로 시저 호출 
는 CALL PROC1 ( @name )
 - . 9 이 경우 저장 프로 시저 PROC1 삭제 
DROP  PROCEDURE  IF가  존재 PROC1을;

 

 

 4, 인바운드 및 아웃 바운드 매개 변수

-- 1.将mysql分隔符从;设置为&
DELIMITER &
-- 2.如果存在存储过程proc1则删除
DROP PROCEDURE IF EXISTS `proc1` &
-- 3.定义存储过程(传入参数,类型字符串。传出参数,类型整型)
CREATE PROCEDURE proc1(IN n CHAR, OUT c INT) 
    BEGIN
    -- 4.执行指定sql(into就是把数据放到指定变量里,这里就是放到c)
    SELECT COUNT(*) INTO c FROM t1 t WHERE t.name LIKE CONCAT('%',n,'%');
    END
    -- 5.结束
    &
-- 6.将mysql分隔符从;设置为;
DELIMITER ;
-- 7.设置变量
SET @name='1';
SET @count=0;
-- 8.调用存储过程,传入传出参数
CALL proc1(@name, @count);
-- 9.打印
SELECT @count;
-- 10.如果存在存储过程proc1则删除
DROP PROCEDURE IF EXISTS proc1;

 

 

 5、动态sql(无参)

-- 1.将mysql分隔符从;设置为&
DELIMITER &
-- 2.如果存在存储过程proc1则删除
DROP PROCEDURE IF EXISTS `proc1` &
-- 3.定义存储过程(无参)
CREATE PROCEDURE proc1() 
    BEGIN
    -- 4.声明变量
    DECLARE $sqltext VARCHAR(1000);
    -- 5.动态sql
    SET $sqltext = 'SELECT COUNT(*) FROM t1 t where t.name like \'%1%\';';
    -- 一直需要这,不然会报错,目前没有找到资料
    SET @sqlcounts := $sqltext;
    -- 6.预编释,stmt预编释变量的名称
    PREPARE stmt FROM @sqlcounts;
    -- 7.执行SQL语句
    EXECUTE stmt; 
    -- 8.释放资源
    DEALLOCATE PREPARE stmt;
    END
    -- 9.结束
    &
-- 10.将mysql分隔符从;设置为;
DELIMITER ;
-- 11.调用存储过程,无参
CALL proc1();
-- 12.如果存在存储过程proc1则删除
DROP PROCEDURE IF EXISTS proc1;

6、动态sql,传入传出参数

-- 1.将mysql分隔符从;设置为&
DELIMITER &
-- 2.如果存在存储过程proc1则删除
DROP PROCEDURE IF EXISTS `proc1` &
-- 3.定义存储过程(传入参数,类型字符串。传出参数,类型整型)
CREATE PROCEDURE proc1(IN n CHAR, OUT s INT) 
    BEGIN
    -- 4.声明变量
    DECLARE $sqltext VARCHAR(1000);
    -- 5.动态sql,把sql返回值放到@ret_date中
    SET $sqltext = CONCAT('SELECT COUNT(*) into @ret_date FROM t1 t where t.name like \'%', n, '%\'');
    -- 一直需要这,不然会报错,目前没有找到资料
    SET @sqlcounts := $sqltext;
    -- 6.预编释,stmt预编释变量的名称
    PREPARE stmt FROM @sqlcounts;
    -- 7.执行SQL语句
    EXECUTE stmt; 
    -- 8.释放资源
    DEALLOCATE PREPARE stmt;
    -- 9.获取动态SQL语句返回值
    SET s = @ret_date;
    END
    -- 10.结束
    &
-- 11.将mysql分隔符从;设置为;
DELIMITER ;
-- 12.设置变量
SET @name='1';
SET @count=0;
-- 13.调用存储过程,传入传出参数
CALL proc1(@name, @count);
-- 14.打印
SELECT @count;
-- 15.如果存在存储过程proc1则删除
DROP PROCEDURE IF EXISTS proc1;

 

 

参考文章:https://www.cnblogs.com/end/archive/2011/04/01/2002662.html

      https://blog.csdn.net/Peacock__/article/details/83030476

추천

출처www.cnblogs.com/xiaostudy/p/12325155.html