if I modify my function , then select 'select * from (SELECT
attrToString('sex', '2', 11) from DUAL)' succeed
DROP FUNCTION LAB.attrToString
//
CREATE FUNCTION LAB.attrToString
( attr CHAR(50)
, value INT
, revision INT
)
RETURNS VARCHAR
AS
VAR sResult VARCHAR(1000);
attr_name VARCHAR(255);
attr_type VARCHAR(10);
value_type VARCHAR(10);
interval VARCHAR(2);
l_value VARCHAR(12);
u_value VARCHAR(12);
l_unit VARCHAR(10);
u_unit VARCHAR(10);
const_value VARCHAR(50);
const_name VARCHAR(255);
synonym VARCHAR(255);
BEGIN
IF attr IS NULL OR value IS NULL OR revision IS NULL THEN
RETURN '';
SET sResult = '';
TRY
TRY
SELECT cc.attr_name, cc.attr_type, dd.value_type,
dd.interval, dd.l_value, dd.u_value, dd.l_unit, dd.u_unit,
dd.const_value, dd.const_name, CHR(null) synonym
INTO :attr_name, :attr_type, :value_type, :interval,
:l_value, :u_value, :l_unit, :u_unit, :const_value, :const_name, :synonym
FROM
LAB.er_dictionary_attributes cc,
LAB.er_attribute_default_values dd
WHERE
cc.attr = :attr
AND cc.defined = 'const'
AND dd.attr_value = :value;
CATCH
IF $rc = 100 THEN BEGIN
SELECT cc.attr_name, cc.attr_type, dd.value_type,
dd.interval, dd.l_value, dd.u_value, dd.l_unit, dd.u_unit,
dd.const_value, dd.const_name, dd.synonym
INTO :attr_name, :attr_type, :value_type, :interval,
:l_value, :u_value, :l_unit, :u_unit, :const_value, :const_name, :synonym
FROM
LAB.er_dictionary_attributes cc,
LAB.er_attribute_user_values dd
WHERE
cc.attr = :attr
AND cc.defined = 'user'
AND dd.attr_value = :value
AND dd.FromRevisionNo <= :revision
AND :revision < DECODE(dd.ToRevisionNo, NULL,
:revision + 1, dd.ToRevisionNo);
END
ELSE
STOP($rc, $errmsg);
CASE
WHEN value_type = 'const' THEN BEGIN
SET sResult = attr_name || ': ' || const_name;
END;
WHEN value_type = 'interval' THEN BEGIN
CASE
WHEN interval = '[]' THEN BEGIN
SET sResult = '' || l_value || ' ' ||
LAB.unitToString(l_unit) || ' - ' || u_value || ' ' ||
LAB.unitToString(u_unit);
END;
WHEN interval = '>=' THEN BEGIN
SET sResult = '>= ' || l_value || ' ' ||
LAB.unitToString(l_unit);
END;
WHEN interval = '<=' THEN BEGIN
SET sResult = '<= ' || u_value || ' ' ||
LAB.unitToString(u_unit);
END;
WHEN interval = '>' THEN BEGIN
/* not implement */
RETURN sResult;
END;
WHEN interval = '<' THEN BEGIN
/* not implement */
RETURN sResult;
END;
WHEN interval = '=' THEN BEGIN
/* not implement */
RETURN sResult;
END;
WHEN interval = '(]' THEN BEGIN
/* not implement */
RETURN sResult;
END;
WHEN interval = '()' THEN BEGIN
/* not implement */
RETURN sResult;
END;
WHEN interval = '[)' THEN BEGIN
/* not implement */
RETURN sResult;
END;
ELSE
RETURN sResult;
END CASE;
SET sResult = attr_name || ': ' || sResult;
IF synonym IS NOT NULL THEN
SET sResult = sResult || ' (' || synonym || ')';
/*
IF unit_name IS NOT NULL THEN
SET s = s || ' ' || unit_name;
*/
END;
ELSE
RETURN 'error: no case value';
END CASE;
CATCH
IF $rc <> 100 THEN
STOP($rc, $errmsg);
RETURN TRIM(sResult);
END;
--
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]