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

Posted

技术标签:

【中文标题】如何将从函数返回的布尔值分配给 PostgreSQL 9.4 中的变量?【英文标题】:How to assign a boolean value returned from a function to a variable in PostgreSQL 9.4? 【发布时间】:2016-02-15 11:16:46 【问题描述】:

我有一个函数可以检查 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');

你能帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

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'

【讨论】:

【参考方案2】:

假设pl/pgsql,这应该可以工作:

SELECT sp_table_exists('temp_table')
  INTO DEBUG_ENABLED

看起来你被 Postgres 之外的东西窃听了。看到这个query。

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,您的建议仍然给我与之前相同的错误。 “无效的类型名称” :( 顺便说一句...刚刚检查过。 CREATE FUNCTIONSELECT INTO 在我的本地 postgres 安装上完美运行。 这令人沮丧,我已经尝试了上面的所有组合以及您的建议 - 仍然是同样的错误! 只是为了交叉检查。您是直接在 psql 提示符上运行它吗(如果是这样,您能告诉 postgres 版本吗)?如果没有,你能详细说明你是如何运行的吗?是通过外部脚本(python / ruby​​ 等)吗? 我在 pgAdmin 上运行它 - 在两个 PostgreSQL 版本(9.4.5 和 9.5)上运行它

以上是关于如何将从函数返回的布尔值分配给 PostgreSQL 9.4 中的变量?的主要内容,如果未能解决你的问题,请参考以下文章

将从方法返回的引用分配给变量

c# 将从单个文本框中获取的多个值分配给标签

如何在sql服务中将列名分配给标量函数的返回值

如何读取数组中所有函数的布尔值(真/假)

如何在过程中显示函数返回的值

为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?