2017-05-06 4 views
0

を展開しません:MySQLの:変数は、私はこのようなMySQLの関数を記述しようとして保存された機能でSELECT文で

DELIMITER // 
CREATE FUNCTION getVal(col varchar(50), xid int, reverse boolean) RETURNS double 
DETERMINISTIC 
READS SQL DATA 
BEGIN 
    declare res DOUBLE DEFAULT 0; 
    SELECT col INTO res FROM col WHERE id = xid; 
    IF(revrese = 1) THEN 
     RETURN 1 - res; 
    END IF; 

    RETURN res; 
END// 
DELIMITER ; 

しかし、私はこのようにそれを実行すると:

SELECT getVal("size", 1, 0); 

変数colは展開されず、テーブル 'col'が存在しないというエラーが返されます。実際にはそうではありません。このコードを正しく動作させるにはどうすればよいですか?

+1

あなたはその 'SELECT'クエリで何を達成しようとしていますか? –

答えて

2

準備中の文で作業する必要があります。

DELIMITER // 
CREATE FUNCTION getVal(col varchar(50), xid int, reverse boolean) RETURNS double 
DETERMINISTIC 
READS SQL DATA 
BEGIN 
    declare res DOUBLE DEFAULT 0; 
    SET @sql = CONCAT('SELECT ', col, ' INTO res FROM ', col, ' WHERE id = ', xid); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    IF(reverse = 1) THEN 
     RETURN 1 - res; 
    END IF; 

    RETURN res; 
END// 
DELIMITER ; 
+0

MySQLだけがストアドプロシージャで動的SQLを許可していれば、これはすばらしいことでしょう。私が気付いたように、あなたのコードを実行しようとすると、「動的SQLはストアド・ファンクションまたはトリガーでは許可されません」。 –

+0

@JanKoutný、ストアドプロシージャ*、それはそうです。しかし、関数やトリガーではありません。ストアド・プロシージャーをストアード・ファンクションから呼び出すことはできますが、そのコンテキストでは動的SQLも許可されません。 –

関連する問題