反斜杠的PostgreSQL语法错误?

时间:2012-01-31 20:53:35

标签: 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也是错误。

2 个答案:

答案 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;
相关问题