Синтаксическая ошибка PostgreSQL от обратной косой черты? - PullRequest
0 голосов
/ 01 февраля 2012

Я отлаживаю файл sql в pgAdminIII PostgreSQL, и этот оператор создает синтаксическую ошибку при выполнении:

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 ]

2 голосов
/ 01 февраля 2012

Таким образом, полное утверждение действительно существенно меняет картину.

Ваша проблема заключается во вложении одинарных кавычек.Если вы используете PostgreSQL « доллар с кавычками », все будет намного проще:

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 голос
/ 01 февраля 2012

Это точно так же, просто проще:

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;
...