sql >> データベース >  >> RDS >> Mysql

ストアドプロシージャの動的カーソル

    MySQLマニュアル から

    ただし、2つの方法があります。

    1つ目は、一度に1人のユーザーのみがプロシージャを実行する場合です。プリペアドステートメントを使用して動的SQLでビューを作成でき、カーソルはこの静的な名前のビューから選択できます。パフォーマンスへの影響はほとんどありません。残念ながら、これらのビューは他のユーザーにも表示されるため(一時的なビューなどはありません)、これは複数のユーザーには機能しません。

    同様に、一時テーブルはprepareステートメントで作成でき、カーソルは一時テーブルから選択できます。現在のセッションのみが一時テーブルを表示できるため、複数ユーザーの問題が解決されます。ただし、procを実行するたびに一時テーブルを作成する必要があるため、このソリューションはパフォーマンスに大きな影響を与える可能性があります。

    結論:動的に作成できるようにするには、カーソルが必要です。

    ビューを使用して、テーブル名と列名をmysqlフォーラム

    DELIMITER // 
    DROP PROCEDURE IF EXISTS test_prepare// 
    
    CREATE PROCEDURE test_prepare(IN tablename varchar(255), columnname varchar(50)) 
    BEGIN 
    DECLARE cursor_end CONDITION FOR SQLSTATE '02000'; 
    DECLARE v_column_val VARCHAR(50); 
    DECLARE done INT DEFAULT 0; 
    DECLARE cur_table CURSOR FOR SELECT * FROM test_prepare_vw; 
    DECLARE CONTINUE HANDLER FOR cursor_end SET done = 1; 
    
    SET @query = CONCAT('CREATE VIEW test_prepare_vw as select ', columnname, ' from ', tablename); 
    select @query; 
    PREPARE stmt from @query; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
    
    OPEN cur_table; 
    FETCH cur_table INTO v_column_val; 
    WHILE done = 0 DO 
    SELECT v_column_val; 
    FETCH cur_table INTO v_column_val; 
    END WHILE; 
    CLOSE cur_table; 
    
    DROP VIEW test_prepare_vw; 
    
    END; 
    // 
    
    DELIMITER ;
    



    1. ソース管理とストアドプロシージャ

    2. SQLServer-SQLスクリプトの実行を停止または中断します

    3. SQL Serverの照合で、大文字と小文字を区別するものから大文字と小文字を区別しないものに変更しますか?

    4. Oracleで日付をフォーマットする方法