2016-02-25 37 views
0

我试图运行代码:如何通过表名PLPGSQL功能

CREATE OR REPLACE FUNCTION anly_work_tbls.testfncjh (tablename text) returns int 
AS $$ 
DECLARE 
     counter int; 
     rec record; 
     tname text; 
BEGIN 
counter = 0; 
tname := tablename; 
FOR rec IN 
     select * 
     from tname 
    loop 
     counter = counter + 1; 
    end loop; 
RETURN counter; 
END; 
$$ 
LANGUAGE 'plpgsql' IMMUTABLE 
SECURITY DEFINER; 

这段代码的目标是回到表中你输入的行数。我知道这可能不是完成这个任务的最好方式,但是这个功能的结构可以很好地扩展到我想要解决的另一个问题。每次我运行代码,我得到的错误:

ERROR: syntax error at or near "$1" 

我发现所有的网上资源,告诉我如何使用内EXECUTE块的输入变量,而不是在出现上述情况。

当前正在运行的PostgreSQL 8.2.15。

回答

0

是真的不是最好的方式,但是这会工作:

CREATE OR REPLACE FUNCTION testfncjh (tablename text) returns int 
AS $$ 
DECLARE 
     counter int; 
     rec record;   
BEGIN 
counter = 0; 
FOR rec IN 
     EXECUTE 'select * from '||quote_ident(tablename) loop 
     counter = counter + 1; 
    end loop; 
RETURN counter; 
END; 
$$ 
LANGUAGE 'plpgsql' IMMUTABLE 
SECURITY DEFINER; 

这会更好:

CREATE OR REPLACE FUNCTION testfncjh (tablename text) returns int 
AS $$ 
DECLARE _count INT; 
BEGIN  
EXECUTE 'SELECT count(*) FROM '|| quote_ident(tablename) INTO _count; 
RETURN _count; 
END; 
$$ 
LANGUAGE 'plpgsql' IMMUTABLE 
SECURITY DEFINER; 
+0

谢谢,这是有益的。 – JHoffman

1
CREATE OR REPLACE FUNCTION anly_work_tbls.testfncjh (tbl regclass, OUT row_ct int) AS 
$func$ 
BEGIN  
    EXECUTE 'SELECT count(*) FROM '|| tbl 
    INTO row_ct; 
END 
$func$ LANGUAGE plpgsql IMMUTABLE SECURITY DEFINER; 

电话:

SELECT anly_work_tbls.testfncjh('anly_work_tbls.text_tbl'); 

这应该为Postgres 8.2工作,但你无论如何,。

如果你实际上是通过动态查询的结果需要循环:

CREATE OR REPLACE FUNCTION anly_work_tbls.testfncjh (tbl regclass) 
    RETURNS int AS 
$func$ 
DECLARE 
    counter int := 0; -- init at declaration time 
    rec record; 
BEGIN 
    FOR rec IN EXECUTE 
     'SELECT * FROM ' || tbl 
    LOOP 
     counter := counter + 1; -- placeholder for some serious action 
    END LOOP; 

    RETURN counter; 
END 
$func$ LANGUAGE plpgsql IMMUTABLE SECURITY DEFINER; 
+0

谢谢,这工作! – JHoffman