【问题标题】:How to pass table name to plpgsql function如何将表名传递给 plpgsql 函数
【发布时间】:2016-02-25 20:26:39
【问题描述】:

我正在尝试运行代码:

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。

【问题讨论】:

    标签: postgresql function variables plpgsql dynamic-sql


    【解决方案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,但无论如何你 consider upgrading to a current version

    如果你确实需要遍历动态查询的结果:

    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;
    

    【讨论】:

      【解决方案2】:

      是的确实不是最好的方法,但这会起作用:

      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;
      

      【讨论】:

      • 谢谢,这很有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多