在 Postgres 8.4 中实现为 Postgres 9.4 编写的函数

Dan*_*Dan 5 postgresql

我有一个需要在 Postgres 8.4 上实现的简单函数(在 Postgres 9.4 上测试过)。我得到的错误是函数格式不存在。我一直在努力寻找资源,但 8.4 在这个阶段已经 6 岁了,除了文档之外很难找到相关信息!

CREATE OR REPLACE FUNCTION create_table()
  RETURNS void AS
$BODY$
DECLARE
    rows RECORD;

BEGIN
    FOR rows IN SELECT column as tablename from table
        LOOP
            EXECUTE format('
               CREATE TABLE IF NOT EXISTS %I (
                date date,
                number integer
               )', rows.tablename);

        END LOOP ;
    RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

ERROR:  function format(unknown, text) does not exist
LINE 1: SELECT  format('
                ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激!

编辑:我已将函数中的循环修改为:

        LOOP
            EXECUTE 'CREATE TABLE IF NOT EXISTS ' || rows || ' (
                date date,
                number integer
               )', rows.tablename;

        END LOOP ;
Run Code Online (Sandbox Code Playgroud)

但是现在我在 quote_ident() 上收到此错误:

ERROR:  function quote_ident(record) does not exist
Run Code Online (Sandbox Code Playgroud)

dez*_*zso 4

预格式化解决方案曾经是很好的旧串联,通过使用quote_ident().

在你的情况下,它看起来像

...
    EXECUTE $$ 
        CREATE TABLE IF NOT EXISTS $$ || quote_ident(rows.tablename) || $$ (
             date date,
             number integer
        ) $$;
...
Run Code Online (Sandbox Code Playgroud)

请注意,这里我在构建动态查询时使用美元引用。例如,这允许我使用“正常”语法,而不是乘以单引号(本示例中不存在)。这样,大多数编辑都会很好地突出显示这些语句。

8.4 版本的另一个缺点是该CREATE TABLE IF NOT EXISTS语法不存在 - 它是在 9.1 中引入的。您仍然可以对其进行测试:

IF EXISTS (SELECT 1 FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname = 'rows.tablename' AND nspname = 'your_schema')
THEN
    -- do the EXECUTE
END IF;
Run Code Online (Sandbox Code Playgroud)

如果您只有一种架构,则可以省略对 的联接pg_namespacepg_classpg_namespace是系统目录的一部分 - 您可能想查看那里还可以找到什么。