我如何使用 if exists with execute?

How can I use if exists with execute?

由于语法错误,我无法创建此存储过程。有没有人可以解决这个语法问题?

DROP PROCEDURE REMOTE_DB_CONNECTION_REMOVER;
CREATE PROCEDURE REMOTE_DB_CONNECTION_REMOVER(
    rm_server_user varchar(100),
    rm_server_name varchar(100),
    rm_table varchar(100),
    rm_server_extenstion integer=0
 ) LANGUAGE PLPGSQL AS $$
BEGIN

    IF EXISTS(EXECUTE FORMAT('DROP FOREIGN TABLE  %s', rm_table)) THEN
        EXECUTE FORMAT('DROP FOREIGN TABLE  %s', rm_table);
    END IF

    IF EXISTS(EXECUTE FORMAT('DROP USER MAPPING FOR %s SERVER %s',rm_server_user, rm_server_name)) THEN
        EXECUTE FORMAT('DROP USER MAPPING FOR %s SERVER %s',rm_server_user, rm_server_name);
    END IF

    IF EXISTS(EXECUTE FORMAT('DROP SERVER %s', rm_server_name)) THEN
        EXECUTE FORMAT('DROP SERVER %s', rm_server_name);
    END IF
            
END; $$ 

exists 只能与 SELECT 语句一起使用。

但是根本不需要 IF 语句。所有三个命令都支持 IF EXISTS 选项。要使用 format() 在动态 SQL 中包含 table 名称或任何标识符,您应该使用 %I 占位符。

DROP PROCEDURE REMOTE_DB_CONNECTION_REMOVER;
CREATE PROCEDURE REMOTE_DB_CONNECTION_REMOVER(
    rm_server_user varchar(100),
    rm_server_name varchar(100),
    rm_table varchar(100),
    rm_server_extension integer=0
 ) LANGUAGE PLPGSQL AS $$
BEGIN
  EXECUTE FORMAT('DROP FOREIGN TABLE IF EXISTS %I', rm_table);
  EXECUTE FORMAT('DROP USER MAPPING IF EXISTS FOR %I SERVER %I',rm_server_user, rm_server_name);
  EXECUTE FORMAT('DROP SERVER IF EXISTS %I', rm_server_name);
END; $$ 

呼叫remote_db_connection_remover('postgres','remote_server12','student');