2017-10-16 5 views
0

MySQLエラー1415についてもう一度お詫び申し上げます。mariaDB(MySQL)は、SELECT INTOを使用した後に「関数から結果セットを返すことはできません」というエラー1415を取得します

しかし、私はStackOverflowのエラー1415に関する同様の質問や、Googleの多くの結果について、これまでに2時間も費やしてきましたが、残念ながらどこでも見つけられませんでした私は次の関数宣言で間違っています。

私は、標準の1GBTPC-Hデータベースを使用して、いくつかのコースを割り当てています。この関数は、埋め込みSQLクエリの終了に要する時間を計算します。

DELIMITER // 

CREATE FUNCTION 
TestIndex (
    P_PARTNAME CHAR(55) 
) 
RETURNS INTEGER 

BEGIN 

    DECLARE 
     BEGINTIME TIMESTAMP(3); 
    DECLARE 
     ENDTIME TIMESTAMP(3); 
    DECLARE 
     DURATION INT; 

    SELECT 
     CURRENT_TIMESTAMP(3) 
    INTO 
     BEGINTIME; 

    SELECT 
     1 
    FROM 
     PART 
    WHERE 
     P_NAME = P_PARTNAME; 

    SELECT 
     CURRENT_TIMESTAMP(3) 
    INTO 
     ENDTIME; 

    SELECT 
     TIMESTAMPDIFF(MICROSECOND, BEGINTIME, ENDTIME) 
    INTO 
     DURATION; 

RETURN DURATION; 

END // 

私はmariaDB、Fedoraの26(はい、それはFedoraの上、ハハ、新しいことができない場合)の最新バージョンを使用しています - だけでなく、私は、これはのバージョンとは何かを持っているとは思いません私のDBMS。

私は前の記事の偉大な解決策を見ていましたが、元の機能を多く変更して、各行がMySQLの能力の範囲内にあることを確認することができました(例えば、 PostgreSQLの特別であるPERFORM * FROMを使用し、それゆえ私は、複数の投稿によると、SELECT 1 FROMに切り替える。

私もRETURN 1にしようとしたが、それはまだ1415エラーです。私は実行する構文規則のいずれかを取ったの?ありがとう!!

+0

を使用するように簡略化することができ、その関数はint型を返すように望んでいるときにタイムスタンプを返していません。そして、私が知る限り、 'timestampdiff()'は整数を返し、 'timestamp'は返しません。 –

+0

'SELECT 1 FROM PART WHERE P_NAME = P_PARTNAME'には' INTO'節がありません。結果セットを返そうとしています。 –

+0

@GordonLinoffありがとう!私は 'DURATION'のデータ型を' 'INT''に変更しましたが、それでも動作しません。 (私も質問のコードを更新しました) – jackxujh

答えて

0

これをストアドプロシージャに変換します。次にSELECTなどを実行できます。

一方、タイミング結果を含むOUTパラメータがあります。

計算は宣言をスキップし、データ型を修正する必要があり

SET @BEGINTIME := CURRENT_TIMESTAMP(6); 
... 
SET OutResult := TIMESTAMPDIFF(MICROSECOND, @BEGINTIME, CURRENT_TIMESTAMP(6)); 
+0

あなたの答えをありがとう! 'OUT'パラメータをどのように追加すればいいですか? – jackxujh

+0

https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html –

関連する問題