Mak*_*aki 14 arrays postgresql arraylist plpgsql set-returning-functions
我的最后一个问题将数组传递给存储到postgres有点不清楚.现在,澄清我的目标:
我想创建一个Postgres存储过程,它将接受两个输入参数.一个将是一些数量的列表,例如(100, 40.5, 76)
,另一个将是一些发票的 列表('01-2222-05','01-3333-04','01-4444-08')
.之后我想使用这两个数字和字符列表并对它们做一些事情.例如,我想从这一组数字中取出每个金额,并将其分配给相应的发票.
在Oracle中类似的东西看起来像这样:
SOME_PACKAGE.SOME_PROCEDURE (
789,
SYSDATE,
SIMPLEARRAYTYPE ('01-2222-05','01-3333-04','01-4444-08'),
NUMBER_TABLE (100,40.5,76),
'EUR',
1,
P_CODE,
P_MESSAGE);
Run Code Online (Sandbox Code Playgroud)
当然,这两种类型SIMPLEARRAYTYPE
,并NUMBER_TABLE
出现在靠前的DB定义.
Erw*_*ter 18
你会喜欢 Postgres 9.4的这个新功能:
unnest(anyarray, anyarray [, ...])
Run Code Online (Sandbox Code Playgroud)
unnest()
非常期待(至少是我)能够干净地并行排除多个阵列的能力.手册:
将多个数组(可能是不同类型)扩展为一组行.这只能在FROM子句中使用;
这是新ROWS FROM
功能的特殊实现.
你的功能现在可以是:
CREATE OR REPLACE FUNCTION multi_unnest(_some_id int
, _amounts numeric[]
, _invoices text[])
RETURNS TABLE (some_id int, amount numeric, invoice text) AS
$func$
SELECT _some_id, u.* FROM unnest(_amounts, _invoices) u;
$func$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
呼叫:
SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
Run Code Online (Sandbox Code Playgroud)
当然,简单的表单可以用普通的SQL替换(没有附加功能):
SELECT 123 AS some_id, *
FROM unnest('{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS u(amount, invoice);
Run Code Online (Sandbox Code Playgroud)
在早期版本(Postgres 9.3-)中,您可以使用不太优雅且不太安全的形式:
SELECT 123 AS some_id
, unnest('{100, 40.5, 76}'::numeric[]) AS amount
, unnest('{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS invoice;
Run Code Online (Sandbox Code Playgroud)
旧速记形式的注意事项:除了在SELECT
列表中具有设置返回功能的非标准之外,返回的行数将是每个数组元素数量的最低公倍数(对于不相等的数字具有令人惊讶的结果).这些相关答案的详细信息:
这种行为终于被Postgres 10消毒了.SELECT
列表中的多个设置返回函数现在以"锁定步骤"生成行.看到:
小智 5
数组是通过添加[]
到基本数据类型来声明的。您可以像声明常规参数一样将它们声明为参数:
以下函数接受整数数组和字符串数组,并将返回一些虚拟文本:
create function array_demo(p_data integer[], p_invoices text[])
returns text
as
$$
select p_data[1] || ' => ' || p_invoices[1];
$$
language sql;
select array_demo(array[1,2,3], array['one', 'two', 'three']);
Run Code Online (Sandbox Code Playgroud)
SQLFiddle 演示:http://sqlfiddle.com/#!15/fdb8d /1
归档时间: |
|
查看次数: |
8679 次 |
最近记录: |