我有一个需要在 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)
预格式化解决方案曾经是很好的旧串联,通过使用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_namespace
。 pg_class
和pg_namespace
是系统目录的一部分 - 您可能想查看那里还可以找到什么。
归档时间: |
|
查看次数: |
650 次 |
最近记录: |