Обсуждение: pl/pgsql frustration

Поиск
Список
Период
Сортировка

pl/pgsql frustration

От
John Wells
Дата:
Guys,

I'm trying to write a simple function that will return a table's actual
row count on PostgreSQL 7.4.  I've tried two different versions (see
below), both with the same result:

"ERROR:  syntax error at or near "select" at character 127"

I've also tried a cursor example found in the interactive 7.4 docs and
get a similar 'select' error.  Am I missing something here or is
something else going on?  Thanks for any help you can provide.

John
----
create or replace function count_rows (text) returns integer as '
declare
  return_val int4;
  curs1 refcursor;
  table_name ALIAS FOR $1;
begin
    OPEN curs1 FOR EXECUTE 'select * from ' || quote_indent(table_name);

    fetch curs1 into return_val;
    close curs1;
end;
' language 'plpgsql';

create or replace function count_rows (text) returns integer as '
declare
  return_val int4;
  curs1 cursor FOR EXECUTE 'select count(*) from ' ||
quote_indent(table_name);
  table_name ALIAS FOR $1;
begin
    OPEN curs1;
    fetch curs1 into return_val;
    close curs1;
end;
' language 'plpgsql';


Re: pl/pgsql frustration

От
John Wells
Дата:
Guys,

Sorry...never mind.  I had accidentally pulled up 8.0 documentation and
confused the syntax (single quotes being ok with you're using the $$
quoting, which I'm not).

Thanks,
John


Re: pl/pgsql frustration

От
Michael Fuhr
Дата:
On Sat, Aug 13, 2005 at 11:19:25PM -0400, John Wells wrote:
> I'm trying to write a simple function that will return a table's actual
> row count on PostgreSQL 7.4.  I've tried two different versions (see
> below), both with the same result:
>
> "ERROR:  syntax error at or near "select" at character 127"

You're having quoting problems; see "Handling of Quotation Marks"
in the "Tips for Developing in PL/pgSQL" section of the documentation:

http://www.postgresql.org/docs/7.4/interactive/plpgsql-development-tips.html

PostgreSQL 8.0 simplifies quoting issues by allowing an alternate
style known as "dollar quoting":

http://www.postgresql.org/docs/8.0/interactive/plpgsql-development-tips.html

In addition, the functions you posted have "quote_ident" misspelled
and they don't have RETURN statements.  You might also want to
create the functions as STRICT (aka RETURNS NULL ON NULL INPUT).
See the CREATE FUNCTION documentation for more info:

http://www.postgresql.org/docs/7.4/interactive/sql-createfunction.html

--
Michael Fuhr