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]

Reply via email to