【问题标题】:Pass more than 100 Arguments in a function using Array as parameter使用数组作为参数在函数中传递超过 100 个参数
【发布时间】:2020-01-26 00:12:11
【问题描述】:

我需要创建一个存储过程来检查表中是否存在特定帐户(如果存在)

需要在 PostgreSQL 中创建自定义函数来更新/插入表。 我需要传递大约 200 个无法实现的值。 有人建议使用 Array 作为参数。但它不适合我。所有 200 个字段都与 int、varchar、double、float 等组合在一起。而且我们不能更改顺序。

请告诉我如何将这些作为参数传递并在更新/插入语句中使用它们。

我的代码看起来像这样

create or replace function test(variadic text[])
....
Begin
Insert into customers (custno , company, firstname) values ($1[1],$1[2],$1[3]);
....
END;

【问题讨论】:

  • 那么你的函数不仅是可变参数的,还是多态的?你到底想在那里做什么,你打算怎么称呼它?

标签: sql postgresql stored-procedures


【解决方案1】:

最好的方法是将复合类型作为参数传递。

您可以使用命名为表的类型并使用CREATE TABLE 自动创建。

这是一个包含 300 列的工作示例:

CREATE TABLE wide (
   i0 integer,
   t0 text,
   d0 date,
   i1 integer,
   t1 text,
   d1 date,
   i2 integer,
   t2 text,
   d2 date,
   i3 integer,
   t3 text,
   d3 date,
[... many missing columns]
   i99 integer,
   t99 text,
   d99 date
);

CREATE OR REPLACE PROCEDURE insert_wide(arg wide)
   LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO wide SELECT (arg).*;
END;$$;

CALL insert_wide(
        ROW(
           0,
           'atext',
           current_date + 0,
           1,
           'atext',
           current_date + 1,
           2,
           'atext',
           current_date + 2,
           3,
           'atext',
           current_date + 3,
[again, many missing columns]
           99,
           'atext',
           current_date + 99
        )
     );

但我认为,如果您的表格包含那么多列,那么您做错了。

【讨论】:

  • 劳伦兹你好。感谢您的宝贵回复。但我以某种方式设法使用数组作为参数创建了函数。但现在我面临另一个问题。我们像这样将值传递给函数 Select functionName ('{val1,val2,val3....,val205}');此函数是从另一个系统调用的,因此无法使用 {} 调用。它只能像这样调用 Select functionName ('Val1','Val2','val3',.....val2015);我尝试使用 Variadic 但仍然无法正常工作(无法传递超过 100 个参数错误)。有什么建议如何使用它?
  • 好吧,如果你不能传递那么多参数,那你就不能,对吧?缺少更改 PostgreSQL 代码,你能做什么?你必须做一些不同的事情。在不知道这个“另一个系统”的情况下,我无法为您提供帮助。
猜你喜欢
  • 2012-01-17
  • 2021-02-23
  • 1970-01-01
  • 2012-12-16
  • 2021-10-17
  • 2010-10-01
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多