查看有关用户定义的 SQL 函数的信息
只要拥有 EXECUTE 权限,您就可以访问有关用户定义的 SQL 函数的信息。可以从系统表 USER_FUNCTIONS 访问此信息,也可以通过 vsql 元命令 \df
访问此信息。
要查看您拥有 EXECUTE 权限的所有用户定义的 SQL 函数,请查询 USER_FUNCTIONS:
=> SELECT * FROM USER_FUNCTIONS;
-[ RECORD 1 ]----------+---------------------------------------------------
schema_name | public
function_name | myzeroifnull
function_return_type | Integer
function_argument_type | x Integer
function_definition | RETURN CASE WHEN (x IS NOT NULL) THEN x ELSE 0 END
volatility | immutable
is_strict | f
如果要更改用户定义的 SQL 函数的主体,请使用 CREATE OR REPLACE 语法。以下命令修改了 CASE 表达式:
=> CREATE OR REPLACE FUNCTION myzeroifnull(x INT) RETURN INT
AS BEGIN
RETURN (CASE WHEN (x IS NULL) THEN 0 ELSE x END);
END;
现在,当您查询 USER_FUNCTIONS 时,可在 function_definition
列中查看所做更改:
=> SELECT * FROM USER_FUNCTIONS;
-[ RECORD 1 ]----------+---------------------------------------------------
schema_name | public
function_name | myzeroifnull
function_return_type | Integer
function_argument_type | x Integer
function_definition | RETURN CASE WHEN (x IS NULL) THEN 0 ELSE x END
volatility | immutable
is_strict | f
如果使用 CREATE OR REPLACE 语法以便仅更改参数名称或参数类型(或两者),系统会维护函数的两个版本。例如,以下命令将指示函数为 myzeroifnull
函数接受并返回数字数据类型而非整数。
=> CREATE OR REPLACE FUNCTION myzeroifnull(z NUMERIC) RETURN NUMERIC
AS BEGIN
RETURN (CASE WHEN (z IS NULL) THEN 0 ELSE z END);
END;
现在,当您查询 USER_FUNCTIONS 表时,可在 Record 2 中查看 myzeroifnull
的第二个实例,还可以在 function_return_type
、function_argument_type
和 function_definition
列中查看所做更改。
注意
Record 1 仍保留myzeroifnull
函数的原始定义:
=> SELECT * FROM USER_FUNCTIONS;
-[ RECORD 1 ]----------+------------------------------------------------------------
schema_name | public
function_name | myzeroifnull
function_return_type | Integer
function_argument_type | x Integer
function_definition | RETURN CASE WHEN (x IS NULL) THEN 0 ELSE x END
volatility | immutable
is_strict | f
-[ RECORD 2 ]----------+------------------------------------------------------------
schema_name | public
function_name | myzeroifnull
function_return_type | Numeric
function_argument_type | z Numeric
function_definition | RETURN (CASE WHEN (z IS NULL) THEN (0) ELSE z END)::numeric
volatility | immutable
is_strict | f
由于 Vertica 允许具有不同实参类型的函数共用相同名称,因此您必须在更改或删除函数时指定实参类型。否则,系统将返回错误消息:
=> DROP FUNCTION myzeroifnull();
ROLLBACK: Function with specified name and parameters does not exist: myzeroifnull