[SQL]-stored関数とカーソル


1.stored関数の概念と形式

  • を直接生成するために使用される関数をstored関数と呼ぶ.
  • DELIMITER $$                
    CREATE FUNCTION 스토어드_함_함수_이름(매개변수)
    (매개변수)                  
    RETURNS 반환형식            
    BEGIN                       
                                
    프로그래밍 코딩             
    RETURN 반환값;              
                                
    END $$                      
    DELIMITER ;                 
    SELECT 스토어드_함수_이름();
    stored関数のパラメータはすべて入力パラメータです.

    2.Stored関数の使用

  • ストレージ関数を使用するには、ストレージ関数の作成を許可する必要があります.
  • SET GLOBAL log_bin_trust_function_creators = 1;
    USE market_db;
    DROP FUNCTION if EXISTS sumFunc;
    DELIMITER $$
    CREATE FUNCTION sumFunc(NUMBER1 INT, NUMBER2 INT)
    RETURNS INT
    BEGIN
    RETURN NUMBER1 + NUMBER2;
    END $$
    DELIMITER ;
    
    SELECT sumFunc(100, 200) AS '합계';

    アクティブ期間出力関数
    DROP FUNCTION if EXISTS calcYearFunc;
    DELIMITER $$
    CREATE FUNCTION calcYearFunc(dYear INT)
    RETURNS INT
    BEGIN
    DECLARE runYear INT;
    SET runYear = YEAR(CURDATE()) - dYear;
    RETURN runYear;
    END $$
    DELIMITER ;
    
    SELECT calcYearFunc(2010) AS '활동 햇수';

    関数の戻り値をSELECT~INTO~として保存して使用することもできます.
    SELECT calcYearFunc(2007) INTO @debut2007;
    SELECT calcYearFunc(2013) INTO @debut2013;
    SELECT @debut2007 - @debut2013 AS '2007과 2013 차이';

    関数は主にテーブルをクエリーし、その値を計算するために使用されます.
    SELECT mem_id, mem_name, calcYearFunc(YEAR(debut_date)) AS '활동 햇수'
    FROM member;

    削除
  • DROP FUNCTION calcYearFunc;

    3.カーソルによる逐行処理


  • カーソルは、テーブル内で行単位で処理されます.

  • カーソルの基本概念


    カーソルは最初の行を処理し、最後の行まで行ごとに近づき、値を処理します.
  • カーソル宣言
  • 宣言
  • 繰返し条件
  • カーソル
  • を開く
  • |-データのインポート
    |(この部分を繰り返す)
  • |-データ処理
  • カーソルが閉じる
  • 逐次練習カーソル

  • の変数
  • を使用する準備
    DECLARE memNumber INT;
    DECLARE cnt INT DEFAULT 0;
    DECLARE totNumber INT DEFAULT 0;
    DECLARE endOfRow BOOLEAN DEFAULT FALSE;
  • カーソル宣言
  • DECLARE memberCuror CURSOR FOR
    		SELECT mem_number FROM member;
    宣言
  • 繰返し条件
  • DECLARE CONTINUE handler
    		FOR NOT FOUND SET endOfRow = TRUE;
  • カーソル
  • を開く
    OPEN memberCuror;
  • を繰り返す
    cursor_loop: loop
    		fetch memberCuror INTO memNumber;
    		
    		if endOfRow then
    		leave cursor_loop;
    		END if;
    		
    		SET cnt = cnt + 1;
    		SET totNumber = totNumber + memNumber;
    	END loop cursor_loop;
        SELECT (totNumber/cnt) AS '회원의 평균 인원 수';
  • カーソルが閉じる
  • close memberCuror;
  • 最終コード
  • USE market_db;
    DROP PROCEDURE if EXISTS cursor_proc;
    DELIMITER $$
    CREATE PROCEDURE cursor_proc()
    begin
    	DECLARE memNumber INT;
    	DECLARE cnt INT DEFAULT 0;
    	DECLARE totNumber INT DEFAULT 0;
    	DECLARE endOfRow BOOLEAN DEFAULT FALSE;
    	
    	DECLARE memberCuror CURSOR FOR
    		SELECT mem_number FROM member;
    	
    	DECLARE CONTINUE handler
    		FOR NOT FOUND SET endOfRow = TRUE;
    		
    	OPEN memberCuror;
    	
    	cursor_loop: loop
    		fetch memberCuror INTO memNumber;
    		
    		if endOfRow then
    		leave cursor_loop;
    		END if;
    		
    		SET cnt = cnt + 1;
    		SET totNumber = totNumber + memNumber;
    	END loop cursor_loop;
    	
    	SELECT (totNumber/cnt) AS '회원의 평균 인원 수';
    	close memberCuror;
    END $$
    DELIMITER ;
    
  • 運転
  • CALL cursor_proc();