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');

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

4

2 回答 2

2

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'
于 2016-02-15T12:21:14.363 回答
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=#
于 2016-02-15T11:18:31.627 回答