postgresql无法创建带有文本输入参数的函数

gojuced7  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(43)

Postgresql 13.13.以下函数的任何导数都成功创建,但函数中缺少我的参数。

CREATE OR REPLACE FUNCTION delete_user_and_related_data(p_username TEXT)
RETURNS VOID
LANGUAGE plpgsql
as
$$
DECLARE
    v_uid INTEGER;
BEGIN
    -- Get UID based on the provided username
    SELECT uid INTO v_uid FROM users WHERE username = p_username;

    -- Delete records from user_sessions where uid matches
    DELETE FROM user_sessions WHERE uid = v_uid;
    
    ---more delete queries...

    -- Delete record from users where username matches
    DELETE FROM users WHERE username = p_username;
END;
$$;

字符串
我尝试将参数定义为一个varchar,在变量前加上“IN”nada。如果我查看函数,如果我尝试调用我得到的函数,参数将丢失:
delete_user_and_related_data(unknown)不是过程
下面是对象定义后的样子:

CREATE FUNCTION "public"."delete_user_and_related_data"() RETURNS void LANGUAGE PLPGSQL
AS
$$

DECLARE
    v_uid INTEGER;
BEGIN
    -- Get UID based on the provided username
    SELECT uid INTO v_uid FROM users WHERE username = p_username;

    -- Delete records from user_sessions where uid matches
    DELETE FROM user_sessions WHERE uid = v_uid;

    -- Delete records from zofolio_user_dream_coins where uid matches
    DELETE FROM zofolio_user_dream_coins WHERE uid = v_uid;

    -- Delete records from zofolio_user_trades where uid matches
    DELETE FROM zofolio_user_trades WHERE uid = v_uid;

    -- Delete record from users where username matches
    DELETE FROM users WHERE username = p_username;
END;

$$


使用DBGrip,我不认为这有什么关系。我也试着用同样的信息创建一个过程,遇到了同样的问题。

guicsvcw

guicsvcw1#

  • 问:如果我尝试调用我得到的函数:delete_user_and_related_data(unknown)不是一个过程 *

当使用CALL而不是SELECT调用函数时,就会发生这种情况。
SELECT应该用于调用函数(用CREATE FUNCTION声明),即使是那些返回void的函数,而CALL用于过程(用CREATE PROCEDURE声明)。

  • Q:如果我查看函数,参数丢失 *

如果你先创建了一个没有参数的函数,然后创建了一个同名但有参数的函数,你会得到两个不同的函数。这就是Function Overloading。如果你不需要这个函数,你想删除它:

DROP FUNCTION delete_user_and_related_data();

字符串
如果你想删除另一个函数,你可以写

DROP FUNCTION delete_user_and_related_data(text);


删除您不需要的版本应该可以消除导致您使用的客户端SQL工具查看错误版本的混淆。

相关问题