【问题标题】:How to create a VIEW from function with parameters?如何从带参数的函数创建视图?
【发布时间】:2015-09-15 14:18:23
【问题描述】:

我在 PostgreSQL 中有这个功能:

CREATE OR REPLACE FUNCTION func1(a integer, b timestamp, c integer[])
  RETURNS SETOF typ_new AS 
$BODY$
declare
begin
    CREATE OR REPLACE VIEW newView as (select * from func2($1,$2,$3));
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

func2 也返回 SETOF typ_new,因此它们是兼容的。

运行时出现错误:ERROR: there is no parameter $1 如果我将$1 更改为参数名称a,则错误更改为 ERROR: column "a" does not exist

我也试过动态SQL:

    sqlstr ='CREATE OR REPLACE VIEW newView (columns... ) as
              (select * from func2('||$1||','||$2||','||$3||'))';
    execute sqlstr;

但它不起作用,因为 $3integer[]|| 不能用于数组。

我该如何解决这个问题?

【问题讨论】:

  • 您似乎正在尝试执行动态 SQL;看看 PL/PgSQL 的 EXECUTEformat 参数。有关详细信息,请参阅许多相关答案。
  • @Craig,查看帖子编辑
  • 也许最好创建VIEW as $BODY$并从此视图中选择函数?

标签: sql postgresql dynamic-sql


【解决方案1】:
CREATE OR REPLACE FUNCTION func1(a integer, b timestamp, c integer[]) RETURNS void AS 
$BODY$
BEGIN
  EXECUTE 'CREATE OR REPLACE VIEW newView AS ' ||
            'SELECT * FROM func2(' || $1 || ', ' || $2 || ', ' || array_to_string($3, ',') || ')';
  RETURN;
END;
$BODY$ LANGUAGE plpgsql STRICT;

请注意,此函数返回void,而不是SETOF typ_new,因为您正在创建视图,而不是从视图返回数据。

由于func2() 返回typ_new,您不必显式声明视图的列,它们将取自SELECT 语句:typ_new 类型的元素。

【讨论】:

  • format%L 格式说明符一起使用,而不是您的串联和array_to_string 调用。清洁工。
【解决方案2】:

我不确定。但是如果你只是想将数组传递给动态 sql 字符串,你可以模拟它吗?..

do
$$
declare 
  a integer[];
begin
  a := array[11,22,33,22,11];
  raise info '%','you can mock up array in like this: array['||array_to_string(a,',')||']';

end;

$$
;

我的情况是这样的:

 sqlstr ='CREATE OR REPLACE VIEW newView (columns... ) as
              (select * from func2('||$1||','||$2||',array['||array_to_string($3,',')||']))';
    execute sqlstr;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多