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

How to assign a boolean value returned from a function to a variable in PostgreSQL 9.4?

我有一个函数可以使用以下代码检查 table 是否存在于 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');

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

假设 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=#

Perform,据我所知,允许您在不 returning 任何值的情况下执行函数。因此,这 return 什么都没有是有道理的。

就将其分配给您的变量而言,我认为它比您想象的要容易:

DEBUG_ENABLED := sp_table_exists('temp_table');

select ... into 通常在您在变量中有一个字段或查询值时使用(这不是您的情况):

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