2017-11-24 13 views
-2

単純なMySQL関数を実行しようとすると、SQL構文エラーが発生します。これらはDb2で動作しています。私はMySQLでそれを実行したい。関数ケースとVARCHARのMySQL構文エラーの取得

CREATE FUNCTION SAMPLE1 
    (
    I INTEGER 
) RETURNS VARCHAR(4) 
    BEGIN 
    CASE 
     WHEN I < 256 THEN RETURN CAST(SUBSTR(HEX(I), 1, 2) AS VARCHAR(4)); 
     WHEN I > 255 AND I < 4096 THEN RETURN CAST((SUBSTR(HEX(BITAND((I/256), 255)), 2, 1) || SUBSTR(HEX(BITAND(I, 255)), 1, 2)) AS VARCHAR(4)); 
     ELSE 
     RETURN CAST((SUBSTR(HEX(BITAND((I/256), 255)), 1, 2) || SUBSTR(HEX(BITAND(I, 255)), 1, 2)) AS VARCHAR(4)); 
    END CASE; 
    END; 

とMySQL上で実行した後、私は

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARCHAR(4)); 
     WHEN I > 255 AND I < 4096 THEN RETURN CAST((SUBSTR(HEX(BITAND' at line 11 

と次

CREATE FUNCTION SAMPLE2 
    (
    PREFIX VARCHAR(43), 
    IP4 BIGINT, 
    VERSION INTEGER 
) RETURNS VARCHAR(39) 
    BEGIN 
    RETURN UPPER(PREFIX || 
     (CASE WHEN VERSION = 4 THEN 
         CAST (BITAND(((IP4 + 4294967296)/16777216), 255) AS VARCHAR(3)) || '.' || 
         CAST (BITAND(((IP4 + 2147483648)/65536), 255) AS VARCHAR(3)) || '.' || 
         CAST (BITAND(((IP4 + 2147483648)/256), 255) AS VARCHAR(3)) || '.' || 
         CAST (BITAND((IP4 + 2147483648), 255) AS VARCHAR(3)) 
     ELSE 
         SUPERHEX(BITAND(((IP4 + 4294967296)/65536), 65535)) || ':' || 
         SUPERHEX(BITAND(IP4, 65535)) 
     END)); 
    END; 

とエラー

you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VARCHAR(3)) || '.' || 
         CAST (BITAND(((IP4 + 2147483648)/65536), 255) AS ' at line 14 

と最後のクエリ

を得るようなエラーを取得しています
CREATE FUNCTION SAMPLE3 
    (
    CONNECTED TIMESTAMP, 
    DISCONNECTED TIMESTAMP, 
    INTERVAL BIGINT 
) RETURNS INTEGER 
    DETERMINISTIC 
    NO EXTERNAL ACTION 
    CONTAINS SQL 
    CALLED ON NULL INPUT 
    BEGIN ATOMIC 
    IF (CONNECTED IS NULL) THEN 
     RETURN -1; 
    ELSEIF (DISCONNECTED IS NULL) THEN 
     RETURN CASE WHEN (INTERVAL = 0 OR CONNECTED + INTERVAL MINUTES > CURRENT TIMESTAMP) THEN 1 ELSE 0 END; 
    ELSE 
     RETURN CASE WHEN (INTERVAL = 0 OR CONNECTED + INTERVAL MINUTES > CURRENT TIMESTAMP) AND CONNECTED > DISCONNECTED THEN 1 ELSE 0 END; 
    END IF; 
    END; 

エラーになっ

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTERVAL BIGINT 
) RETURNS INTEGER 
    DETERMINISTIC 
    NO EXTERNAL ACTION 
    CONTA' at line 9 
  1. VARCHARは、MySQL CAST機能で使用されていませんか?
  2. 区間BIGINT,とCASE WHEN THEN ELSE ENDはmysqlクエリでは異なりますか?

提案や解決策はありますか?

+0

だから、関数を作成するために "あなたのMySQLサーバーのバージョンに対応するマニュアルを正しい構文でチェックしましたか"でしたか? – mustaccio

答えて

0

は、私はそれが好きではないと思う。この

"私は< 256 THEN CAST戻るとき(SUBSTR(HEX(I)、1、2)AS VARCHAR(4))"

それはこの

ようなものです2)VARCHAR AS

I < 256は、THEN(CASTをRETURN SUBSTR(HEX(I)、1、(4)

+0

3回目のクエリ行で 'RETURN CASE WHEN(INTERVAL = 0 OR CONNECTED + INTERVAL MINUTES> CURRENT TIMESTAMP)THEN 1 ELSE 0 END;の問題は何ですか? ? –

0

MySQLのCASTで受け入れ使用されるタイプは、/かなり一般的です。CAST(... AS CHAR)ですべてのあなたのCAST(.... AS VARCHAR(X))を交換してみてください。 forcをする必要がある場合正確なタイプの場合、キャスト結果を宣言された変数に割り当てることができます。

編集:ちょっとテストしました。 CAST(... AS CHAR(X))も有効です。それは明らかにキャストMySQLのVARの部分が好きではないです。

+0

また、3回目のクエリ行の 'RETURN CASE(INTERVAL = 0 OR CONNECTED + INTERVAL MINUTES> CURRENT TIMESTAMP)THEN 1 ELSE 0 END;'の問題は何ですか? –

+0

2番目のクエリでVCHAR(3)をCHAR(3)に編集しました。 CAST(BITAND(((IP4 + 4294967296)/ 16777216)、255)AS CHAR(3))|| '。' || 'エラーが発生しました' CHAR(3)の近くで使用するための正しい構文 '|| '。' || ' –

+0

私は100%確信していませんが、INTERVALは予約語なので、それを使用すると奇妙な問題が発生する可能性があります。 – Uueerdo