42

このsprocを使用して別のテーブルから選択するためにテーブル名をmysqlストアドプロシージャに渡そうとしていますが、機能していません...

これは私が試していることです:

CREATE PROCEDURE `usp_SelectFromTables`(
 IN TableName varchar(100)
)
BEGIN
        SELECT * FROM @TableName;
END

@記号なしで試してみましたが、TableNameが存在しないことがわかります...これは私が知っています:)

4

3 に答える 3

72
SET @cname:='jello';
SET @vname:='dwb';
SET @sql_text = concat('select concept_id,concept_name,',@vname,' from enc2.concept a JOIN enc2.ratings b USING(concept_id) where concept_name like (''%',@cname,'%'') and 3 is not null order by 3 asc');

PREPARE stmt FROM @sql_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2012-02-14T18:25:58.360 に答える
19

私に問題を引き起こした余分なビット。

@kyleが尋ねたように、クエリでテーブル名とフィールドを動的に設定したかったのですが、そのクエリの結果をクエリ@a内の変数に格納したかったのです。

@a変数を文字通りに入れる代わりにconcat、文字列テキストの一部として含める必要があります。

delimiter //

CREATE PROCEDURE removeProcessed(table_name VARCHAR(255), keyField VARCHAR(255), maxId INT, num_rows INT)

BEGIN
  SET @table_name = table_name;
  SET @keyField = keyField;
  SET @maxId = maxId;
  SET @num_rows = num_rows;

  SET @sql_text1 = concat('SELECT MIN(',@keyField,') INTO @a FROM ',@table_name);
  PREPARE stmt1 FROM @sql_text1;
  EXECUTE stmt1;
  DEALLOCATE PREPARE stmt1;

  loop_label:  LOOP
    SET @sql_text2 = concat('SELECT ',@keyField,' INTO @z FROM ',@table_name,' WHERE ',@keyField,' >= ',@a,' ORDER BY ',@keyField,' LIMIT ',@num_rows,',1');
    PREPARE stmt2 FROM @sql_text2;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;

    ...Additional looping code...

    END LOOP;
END
//

delimiter ;

したがって、次を使用して、クエリの結果を文字列内に@sql_text1割り当てます。@a

') INTO @a FROM '

次に、実際の変数として@sql_text2使用されます。@a

,' WHERE ',@keyField,' >= ',@a,' ORDER BY '

于 2012-12-14T06:25:59.997 に答える
17

これはDBMSに依存しますが、表記には通常動的SQLが必要であり、関数からの戻り値が実行時の入力に依存するという問題が発生します。これにより、システムの構成がわかります。原則として(したがって、おそらく例外の対象となります)、DBMSでは、テーブル名や列名などのクエリの構造要素にプレースホルダー(パラメーター)を使用することはできません。列値などの値のみを指定できます。

一部のDBMSには、SQL文字列を作成し、「prepare」または「executeimmediate」または同様の操作を使用してSQL文字列を操作できるストアドプロシージャがサポートされています。ただし、SQLインジェクション攻撃に対して突然脆弱になることに注意してください。プロシージャを実行できる人が、実行されるSQLを部分的に制御できるようになります。

于 2010-05-02T18:15:27.970 に答える