如何在PostgreSQL 9.4中将从函数返回的布尔值分配给变量?

3

我有一个函数,用以下代码检查PostgreSQL数据库中是否存在表:

CREATE OR REPLACE FUNCTION public.sp_table_exists(p_in_table_name character varying)
  RETURNS boolean AS
$$
    DECLARE QUERY_COUNT INTEGER DEFAULT 1;
    QUERY_STRING VARCHAR(300);
    BEGIN
        QUERY_STRING := CONCAT('SELECT RELNAME FROM PG_CLASS WHERE RELNAME = ''',p_in_table_name,'''');
        EXECUTE QUERY_STRING;
        GET DIAGNOSTICS QUERY_COUNT = ROW_COUNT;
        IF QUERY_COUNT > 0  THEN
            RETURN TRUE;
        ELSE
            RETURN FALSE;
        END IF;     
    END;
$$ LANGUAGE plpgsql;

我试图使用上述函数的输出来赋值给一个布尔值,但是PostgreSQL不允许我这样做。
DECLARE DEBUG_ENABLED boolean DEFAULT FALSE;
DEBUG_ENABLED := PERFORM sp_table_exists('temp_table');

或者

DEBUG_ENABLED := SELECT * FROM sp_table_exists('temp_table');

能否请您帮我解决这个问题?

2个回答

2
< p > 根据我的理解,< code > Perform 允许你执行一个函数而不返回任何值。因此,它返回的是空值。

至于将其赋值给您的变量,我认为比您想象的要容易:

DEBUG_ENABLED := sp_table_exists('temp_table');

select ... into 通常用于当你从查询中获取一个字段或值并且想要将其存储到变量中(这不是你的情况):

select count (*) > 0
into DEBUG_ENABLED
from information_schema.tables
where table_name = 'temp_table'

1
假设使用的是 pl/pgsql,这应该可以工作:
SELECT sp_table_exists('temp_table')
  INTO DEBUG_ENABLED

看起来你受到了Postgres外部的某些问题的困扰。请查看这个查询

CREATE FUNCTION / SELECT INTO 在我的端口运行良好。

testdb=# CREATE OR REPLACE FUNCTION public.sp_table_exists(p_in_table_name character varying)
testdb-#   RETURNS boolean AS
testdb-# $$
testdb$# DECLARE QUERY_COUNT INTEGER DEFAULT 1;
testdb$# QUERY_STRING VARCHAR(300);
testdb$#     BEGIN
testdb$#         QUERY_STRING := CONCAT('SELECT RELNAME FROM PG_CLASS WHERE RELNAME = ''',p_in_table_name,'''');
testdb$#         EXECUTE QUERY_STRING;
testdb$#         GET DIAGNOSTICS QUERY_COUNT = ROW_COUNT;
testdb$#         IF QUERY_COUNT > 0  THEN
testdb$#             RETURN TRUE;
testdb$#         ELSE
testdb$#             RETURN FALSE;
testdb$#         END IF;
testdb$#     END;
testdb$# $$ LANGUAGE plpgsql;
CREATE FUNCTION
testdb=# SELECT sp_table_exists('temp_table')
testdb-#   INTO DEBUG_ENABLED;
SELECT 1
testdb=#

我正在使用 pl/pgsql,您的建议仍然导致与之前相同的错误。 "无效类型名称" :( - N00b Pr0grammer
顺便说一句...我刚刚检查了一下。在我的本地Postgres安装中,CREATE FUNCTIONSELECT INTO都完美地工作。 - Robins Tharakan
这真让人沮丧,我已经尝试了上面所有的组合以及你的建议 - 仍然是同样的错误! - N00b Pr0grammer
只是为了核对一下。你是直接在psql提示符上运行吗(如果是,你能告诉我postgres版本吗)?如果不是,你能详细说明你是如何运行的吗?是通过外部脚本(python / ruby等)吗? - Robins Tharakan
我正在pgAdmin上运行此程序 - 在两个PostgreSQL版本(9.4.5&9.5)上运行此程序。 - N00b Pr0grammer

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