我在PostgreSQL的pgAdminIII中调试一个sql文件,这个语句在执行时会产生语法错误:
ERROR: syntax error at or near "v"
LINE 81384: ...n.oid = c.relnamespace WHERE c.relkind IN (\'v\') AND n...
声明:
CREATE OR REPLACE FUNCTION getnextview() RETURNS name AS ' DECLARE my_record RECORD; viewName name; BEGIN FOR my_record IN SELECT c.relname FROM pg_catalog.pg_class AS c LEFT JOIN pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace WHERE c.relkind IN (\'v\') AND n.nspname NOT IN (\'pg_catalog\', \'pg_toast\') AND pg_catalog.pg_table_is_visible(c.oid) LIMIT 1 LOOP viewName := my_record.relname; END LOOP; RETURN (viewName); END; ' LANGUAGE 'plpgsql' VOLATILE;
注意,pg_catalog和pg_toast也是错误。
答案 0 :(得分:2)
因此完整的语句 会大幅改变图片。
您的问题是单引号的嵌套。如果你使用PostgreSQL的“dollar quoting”,一切都会轻松得多:
CREATE OR REPLACE FUNCTION getnextview()
RETURNS name
AS
$body$
DECLARE
my_record RECORD;
viewName name;
BEGIN
FOR my_record IN
SELECT c.relname
FROM pg_catalog.pg_class AS c
LEFT JOIN pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace
WHERE c.relkind IN ('v')
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
LIMIT 1
LOOP
viewName := my_record.relname;
END LOOP;
RETURN (viewName);
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE;
答案 1 :(得分:1)
这完全相同,只是更简单:
CREATE OR REPLACE FUNCTION getnextview()
RETURNS name AS
$BODY$
SELECT c.relname
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'v'
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
LIMIT 1
$BODY$
LANGUAGE sql STABLE;