如何将从函数返回的布尔值分配给 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'
我有一个函数可以使用以下代码检查 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'