我有一个函数,使用以下代码检查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');
你能帮我解决这个问题吗?
答案 0 :(得分: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'
答案 1 :(得分:1)
假设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=#