sql - 来自反斜杠的 PostgreSQL 语法错误?

标签 sql string postgresql syntax literals

我在 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 也会出错。

最佳答案

所以完整的陈述确实大大改变了画面。

你的问题是单引号的嵌套。如果您使用 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;

关于sql - 来自反斜杠的 PostgreSQL 语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9086772/

相关文章:

postgresql - 在 Postgresql 中,序列号设置为从 1 开始,但实际上返回的是 ID 为 2 的新记录?

sql - PostgreSQL 8.4 : Summation by account numbers

c# - C#中如何获取字符串数组的最后三个元素

ruby-on-rails - ActiveRecord 迁移不填充 Postgres 物化 View

r - 一行中的几个替换 R

c++ - strcmp() 和 strcoll() 有什么区别?

database - 具有 git 语义的数据库表的最佳模式?

sql - 在同一个 SELECT sql 查询中从 SUM() 计算百分比

mysql - Sql 'LEFT JOIN' 两个表,每个表都有 'Where' (不是连接条件)

sql - SQL查询中日期为空时如何提取最大日期