mysqlストレージ・プロシージャは、テーブル名をパラメータとしてexecute実行文の結果を取得します.

1188 ワード

あまり話さないで、まずコードをつけます.
DROP PROCEDURE IF EXISTS countTableRows;
CREATE PROCEDURE countTableRows(IN tableName VARCHAR(10),OUT count INT)
BEGIN
SET @sql = CONCAT('SELECT COUNT(*) INTO @count FROM ', tableName);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET count =@count;
END;

テーブル名をパラメータとして使用するには、prepare前処理文に言及する必要があります.
基本的な使い方:
PREPARE stmt from '  sql  ';                 //       
EXECUTE stmt (  sql     , USING xxx,xxx);  //       
DEALLOCATE PREPARE stmt;    //    

機能:
動的クエリーの効果を達成するために、ストレージ中に動的な結合テーブル名、フィールド名を使用できますsql文で使用できますか?パラメータの代わりにワイルドカードを使用すると、sql注入を効果的に防止できます.
ケース:
CREATE PROCEDURE myTest() 
BEGIN
SET @sql = 'SELECT ? AS NUM ';
SET @index = 10;
PREPARE stmt FROM @sql; 
EXECUTE stmt USING @index //         sql   ?
DEALLOCATE PREPARE stmt; 
END;

次の点に注意してください.
SET @sql = CONCAT('SELECT COUNT(*) INTO @count  FROM', tableName);

テーブル名はsqlでは使えませんか?代わりに、文字列でつなぎ合わせるしかありません.一方、executeがsqlを実行した結果を取得するには、「INTO変数名」を前処理sqlに直接つづるとよい.ここの変数名には@を付けなければならない.そうしないと、このストレージ・プロシージャを呼び出すときにエラーが発生する.