如何将从函数返回的布尔值分配给 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 FUNCTION
和 SELECT INTO
在我的本地 postgres 安装上完美运行。
这令人沮丧,我已经尝试了上面的所有组合以及您的建议 - 仍然是同样的错误!
只是为了交叉检查。您是直接在 psql 提示符上运行它吗(如果是这样,您能告诉 postgres 版本吗)?如果没有,你能详细说明你是如何运行的吗?是通过外部脚本(python / ruby 等)吗?
我在 pgAdmin 上运行它 - 在两个 PostgreSQL 版本(9.4.5 和 9.5)上运行它以上是关于如何将从函数返回的布尔值分配给 PostgreSQL 9.4 中的变量?的主要内容,如果未能解决你的问题,请参考以下文章