mysqlストレージ・プロシージャは、テーブル名をパラメータとしてexecute実行文の結果を取得します.
1188 ワード
あまり話さないで、まずコードをつけます.
テーブル名をパラメータとして使用するには、prepare前処理文に言及する必要があります.
基本的な使い方:
機能:
動的クエリーの効果を達成するために、ストレージ中に動的な結合テーブル名、フィールド名を使用できますsql文で使用できますか?パラメータの代わりにワイルドカードを使用すると、sql注入を効果的に防止できます.
ケース:
次の点に注意してください.
テーブル名はsqlでは使えませんか?代わりに、文字列でつなぎ合わせるしかありません.一方、executeがsqlを実行した結果を取得するには、「INTO変数名」を前処理sqlに直接つづるとよい.ここの変数名には@を付けなければならない.そうしないと、このストレージ・プロシージャを呼び出すときにエラーが発生する.
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に直接つづるとよい.ここの変数名には@を付けなければならない.そうしないと、このストレージ・プロシージャを呼び出すときにエラーが発生する.