【问题标题】:How to assign a boolean value returned from a function to a variable in PostgreSQL 9.4?如何将从函数返回的布尔值分配给 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');

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

【问题讨论】:

    标签: postgresql postgresql-9.4 postgresql-9.5


    【解决方案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)上运行它
      猜你喜欢
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2023-03-06
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多