Как мне перечислить все функции в Informix? - PullRequest
0 голосов
/ 04 мая 2018

Я ищу способ перечисления всех пользовательских функций в моей базе данных, работающих на Informix.

Есть ли в базе данных "informix". * Таблица, в которой перечислены функции вместе с подробной информацией о них?

Примечание: этот вопрос намеренно очень похож на Как мне перечислить все хранимые процедуры в Informix? , но относится к функциям , а не процедурам.

1 Ответ

0 голосов
/ 04 мая 2018

Используя таблицу каталога sysprocedures, вы можете фильтровать для не procedure SPL:

SELECT
    *
FROM
    sysprocedures
WHERE
    isproc = 'f';

SYSPROCEDURES

Просмотр информации о пользовательских подпрограммах

Однако я не знаю точного способа определить, определена ли функция пользователем.

Вы можете посмотреть на owner функции, но если она была создана пользователем informix, ее уже нельзя будет отличить от системных функций.

Другие таблицы каталога, относящиеся к функциям, также не содержат достаточно информации, чтобы помочь:

SYSPROCAUTH
SYSPROCBODY
SYSPROCCOLUMNS
SYSPROCPLAN
SYSROUTINELANGS

Читая немного больше документации, кажется, что столбец значения mode в нижнем регистре указывает на protected (системную) подпрограмму. Таким образом, интерес представляют процедуры с режимами O, R, D и T (все в верхнем регистре).

SELECT
    *
FROM
    sysprocedures
WHERE
    isproc = 'f'
    AND mode IN ('O', 'R', 'D', 'T');

Однако это не гарантирует, что подпрограмма создана пользователем. В sysadmin есть подпрограммы, помеченные в режиме O, которые были созданы системой.

Также, если вы, например, в Informix версии 12.10.FC10 используете подпрограмму regex, система автоматически регистрирует блок данных regex, и соответствующие подпрограммы поддержки создаются в режиме O.

EXECUTE FUNCTION regex_match ('Regex module' , '[Mm]odule|DataBlade');

SELECT * FROM sysprocedures WHERE procname= 'regex_match';

procname        regex_match
owner           informix
procid          568
mode            O
retsize         200
symsize         813
datasize        0
codesize        0
numargs         4
isproc          f
specificname
externalname    $INFORMIXDIR/extend/ifxregex.1.00/ifxregex.bld(ifxregex_match_c
                har)
paramstyle      I
langid          1
paramtypes      lvarchar,lvarchar,integer,integer
variant         f
client          f
handlesnulls    t
iterator        f
percallcost     1000
commutator
negator
selfunc
internal        f
class
stack
parallelizable  t
costfunc
selconst        0.00
collation       en_US.819
procflags       0

Итак, система создана, но с режимом O.

...