在to_regclass()函数中使用动态创建的名称

时间:2015-11-27 08:11:08

标签: postgresql plpgsql postgresql-9.5

我已经动态创建了表名,我需要检查这个表是否存在,为此我做了:

....
SELECT to_regclass('public.tableprefix_'||variable_name) INTO table_exists;
IF table_exists IS NULL THEN 
    RETURN 'NOT EXISTS';
ELSE
    RETURN 'EXISTS';
END IF;
....

这会导致错误function to_regclass(text) does not exist

然后我尝试显式类型转换:

SELECT to_regclass('public.tableprefix_'||variable_name::regclass) INTO table_exists;

但同样的错误,我哪里错了?怎么做到这一点?

2 个答案:

答案 0 :(得分:2)

\ df to_regclass

postgres=# \df to_regclass 
                              List of functions
┌────────────┬─────────────┬──────────────────┬─────────────────────┬────────┐
│   Schema   │    Name     │ Result data type │ Argument data types │  Type  │
├────────────┼─────────────┼──────────────────┼─────────────────────┼────────┤
│ pg_catalog │ to_regclass │ regclass         │ cstring             │ normal │
└────────────┴─────────────┴──────────────────┴─────────────────────┴────────┘
(1 row)

你必须使用强制转换为cstring

答案 1 :(得分:1)

另一种方式

 declare 
table_exists boolean;

begin

select EXISTS (
    SELECT 1
    FROM information_schema.tables
    WHERE table_schema = 'public'
        AND table_name = 'tableprefix_' || variable_name || ''
    ) into table_exists;

If  table_exists =true then
RETURN ' EXISTS';
else
RETURN 'NOT EXISTS';
end IF;

end