Version:
MYSQL Ver 14.14 Distrib 5.5.27, for Win32 (x86)
ERROR:
ERROR 1064 (42000) at line 1: 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 'IN P_STRING VARCHAR , IN P_DELIMIT VARCHAR, IN P_POS
INTEGER ) RETURN VARCHAR' at line 1
SQL:
CREATE FUNCTION UsrTOKEN(IN P_STRING VARCHAR , IN P_DELIMIT VARCHAR, IN
P_POS INTEGER )
RETURN VARCHAR
BEGIN
DECLARE P_EOD VARCHAR;
DECLARE P_NTH INTEGER;
DECLARE vStartPos INTEGER;
DECLARE vEndPos INTEGER;
P_EOD := NULL;
P_NTH := 1;
IF (P_POS = 1) THEN
vStartPos := 1;
ELSE
vStartPos := INSTR(P_STRING, P_DELIMIT, 1, P_POS - 1);
IF (vStartPos = 0) THEN
RETURN P_EOD;
END IF;
vStartPos := vStartPos + 1;
END IF;
vEndPos := INSTR(P_STRING, P_DELIMIT, vStartPos, P_NTH);
IF (vEndPos = 0) THEN
RETURN SUBSTR(P_STRING, vStartPos);
END IF;
RETURN SUBSTR(P_STRING, vStartPos, vEndPos - vStartPos);
END;
文字列から区切り文字を指定して何個目かの文字列を抽出するFUCTIONを作ろうとしています。
ネットからPL/SQL用のを拾ってきたのですが、知識不足で旨くカスタマイズできません。
エラーではじかれて部分以外にも間違いが潜んでいるかもしれません。
よろしくお願いします。
コメント(2件)
IN、OUT、INOUTパラメータはFUNCTIONではなくPROCEDUREのパラメータです。
デフォルトでINなので、FUNCTIONでは指定する必要がないようです。
また戻り値の型を指定する「RETURNS type」も足りないようです。
http://dev.mysql.com/doc/refman/5.1/ja/create-procedure.html
----------------------------------------------------------
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
func_parameter:
param_name type
***************************************
デフォルトで各パラメータはINパラメータです。上記とは別にパラメータの属性を特定する場合、OUT またはINOUTキーワードをパラメータ名の前で使用してください。
注:パラメータにIN、OUTしくはINOUTと特定することはPROCEDUREに対してのみ有効です。(FUNCTIONパラメータは常にINパラメータと見なされます。
----------------------------------------------------------
戻り値を定義している構文の部分については分かりません。
PROCEDUREと
ごっちゃになっているかもしれません。
MySQLの本も探してみます。