我如何使用 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');
由于语法错误,我无法创建此存储过程。有没有人可以解决这个语法问题?
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');