PL/pgSQL 函数不能正常工作

Posted

技术标签:

【中文标题】PL/pgSQL 函数不能正常工作【英文标题】:PL/pgSQL function is not working properly 【发布时间】:2013-11-04 07:04:00 【问题描述】:

我正在编写一个函数来为给定的表数创建表。在创建特定表之前,我想检查该表是否已经存在:

create or replace function test (numoftables int) returns void as $$
    declare
    i integer;
    begin 
    i:=0;
    while i< numoftables loop
        if not exists (select * from table$i$)  -- check if table exists
        then 
            create table table$i$(
                column1 int,
                column2 int,
                column1 text,
                column2 text,
                column3 text); 
        end if;
    end loop;
end;

$$
language 'plpgsql';

当我运行这段代码时,它给了我一个错误。

ERROR:  relation "table$i$" does not exist
LINE 1: SELECT not exists (select * from table$i$)

谁能告诉我如何更改此代码才能正常工作。

【问题讨论】:

语言名称是一个常规的 SQL 标识符,这意味着你不应该把它放在单引号中。请改用language plpgsql。将来可能会删除对单引号语言名称的支持。顺便说一句:你为​​什么不使用CREATE TABLE IF NOT EXISTS ... 【参考方案1】: 您不能像这样检查表是否存在。使用pg_class系统表检查表是否存在 你必须在你的函数中增加 i,否则你会陷入无限循环
create or replace function test (numoftables int) returns void as $$
    declare
    i integer;
    begin 
    i:=0;
    while i< numoftables loop
        if not exists (select * from pg_class where relname = 'table' || i::text)
        then
            execute '
            create table table' || i::text || '(
                column1 int,
                column2 int,
                column3 text,
                column4 text,
                column5 text);
            ';
        end if;
        i := i + 1;
    end loop;
end;

$$
language 'plpgsql';

我尝试过不怎么改变你的逻辑或语法,所以它仍然是你的功能。

sql fiddle demo

【讨论】:

以上是关于PL/pgSQL 函数不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从 pgAdmin pgScript 调用 PL/pgSQL 函数?

如何在 PL/pgSQL 中创建嵌套函数?

如何从 java 调用 pl/pgsql

在 PL/pgSQL 函数中使用变量

PL/pgSQL 函数会自行自动提交吗?

简单的 PL/pgSQL 函数的错误