如何列出Informix中的所有函数?

3
我正在寻找一种方法来列出在Informix上运行的我的数据库中所有用户定义的函数。
在“informix”。*数据库中是否有一个表,列出了函数以及关于它们的详细信息?
注意:此问题故意非常类似于如何列出Informix中的所有存储过程?但适用于函数而不是过程。

1
sysprocedures目录表中有一个名为isproc的列。在线文档提供了更多详细信息SYSPROCEDURES - Luís Marques
@LuísMarques 看起来这是一个很好的开始!你能把这个移到答案里并说明如何将其限制为用户定义的吗? - Axel Fontaine
1个回答

3
使用 sysprocedures 目录表,您可以过滤非 procedure SPLs:
SELECT
    *
FROM
    sysprocedures
WHERE
    isproc = 'f';

SYSPROCEDURES

查看有关用户定义例程的信息

然而,我不知道如何确定一个函数是否为用户定义。

您可以查看函数的owner,但如果使用informix用户创建,则无法与系统函数区分开来。

与函数相关的其他目录表似乎也没有足够的信息来帮助解决问题:

SYSPROCAUTH
SYSPROCBODY
SYSPROCCOLUMNS
SYSPROCPLAN
SYSROUTINELANGS

仔细阅读文档后,似乎小写的mode列表示一个受保护的(系统)程序。因此,我们感兴趣的程序是具有大写模式ORDT的程序。

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

然而,这并不能保证该例程是用户创建的。在sysadmin中,有些以模式O标记的例程是由系统创建的。
此外,例如,在Informix版本12.10.FC10中使用正则表达式例程时,系统会自动注册正则表达式数据块,并创建相应支持例程,其模式为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模式。


mode='O'似乎有助于确定它是否为用户定义。 - Axel Fontaine
是的,它有帮助。阅读文档并进行一些简单的测试后,似乎小写模式表示“受保护”的(系统)例程。我会在我的答案中加上这个。 - Luís Marques

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接