1

これが私のコードです

Drop procedure if exists test//
CREATE PROCEDURE test(IN woeid VARCHAR(15))
  BEGIN
   SET @w1 := woeid;
SET @sql = CONCAT('CREATE OR REPLACE VIEW temp 
                   AS
                   SELECT * 
                   FROM test_table gp
                   WHERE gp.name =', @w1);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END//
Delimiter ;

call test('ABCD');

エラー コード: 1054. 不明な列 'ABCD' in 'where' 句が表示されます

助けてください。

4

1 に答える 1

3

他のアプローチがより適切な場合に、ビューを不必要に使用しているように聞こえます。

ただし、それが機能しない理由は、文字列リテラルを引用していないため、結果の SQL にはWHERE gp.name = ABCD少なくともWHERE gp.name = 'ABCD'. この目的にはMySQL の関数を使用できますが、値をパラメーター化することをお勧めします。QUOTE()

DELIMITER //
DROP PROCEDURE IF EXISTS test//
CREATE PROCEDURE test(IN woeid VARCHAR(15))
BEGIN
  SET @w1:=woeid, @sql:=CONCAT('
    CREATE OR REPLACE VIEW temp AS
      SELECT * 
      FROM   test_table
      WHERE  name = ?
  ');
  PREPARE stmt FROM @sql;
  EXECUTE stmt USING @w1;
  DEALLOCATE PREPARE stmt;
  SET @w1:=NULL, @sql:=NULL;
END//
DELIMITER ;

CALL test('ABCD');
于 2013-05-01T14:30:40.083 に答える