我试图在postgres 9.3上使用sql调用函数内的函数。
此问题与another post by me有关。
我写了以下功能。到目前为止,我没有包含任何类型的保存输出(COPY)语句,所以我试图通过创建嵌套函数打印输出函数来解决这个问题。
CREATE FUNCTION retrieve_info(TEXT, TEXT) RETURNS SETOF
retrieve_info_tbl AS $$
SELECT tblA.id, tblA.method, tblA.species, tblA.location
FROM tblA
WHERE method=$1 AND species=$2
GROUP BY id, method, species
ORDER BY location
$$ LANGUAGE 'sql';
以上功能有效。
尝试创建嵌套函数。
CREATE FUNCTION print_out(TEXT, TEXT) RETURNS void AS $$
COPY (SELECT * FROM retrieve_info($1, $2)) TO 'myfilepath/test.csv'
WITH CSV HEADER;
$$ LANGUAGE 'sql';
调用嵌套函数。
SELECT * FROM print_out('mtd1','sp1');
输出
上面给出了这个ERROR: column "$1" does not exist SQL state: 42P02 Context: SQL function "print_out" statement 1
。但是,当用'mtd1','sp1'替换print_out()中的arg1,arg2时,正确的输出将打印到test.csv(如下所示)
id | method | ind | location
----------------------------
1a | mtd1 | sp3 | locA
1d | mtd1 | sp3 | locB
我如何获得retrieve_info()的arg1,arg2在print_out()中正确调用arg1,arg2?
我完全陷入困境。非常感谢任何指示,谢谢
答案 0 :(得分:4)
COPY有点奇怪,因为它将query
参数视为字符串,即使它不是作为字符串写的。结果是query
:
SELECT * FROM retrieve_info($1, $2)
不在函数的上下文中执行,它在COPY本身的上下文中执行。即使你说:
copy (select * from t) ...
它更像是你写的:
copy 'select * from t' ...
因此,在执行查询时,函数参数不再具有任何意义,COPY的query
参数可能看起来像在其他语言中的闭包,但它没有,它起作用更像是传递给eval
的字符串。
你可以使用通常的最后Kludge度假村来解决这种陌生感:dynamic SQL。如果你编写函数来使用字符串争论和EXECUTE:
,你应该会得到更好的结果create or replace function print_out(text, text) returns void as $$
begin
execute 'copy ('
|| 'select * from retrieve_info'
|| '(' || quote_literal($1) || ',' || quote_literal($2) || ')'
|| ') to ''myfilepath/test.csv'' with csv header;';
end;
$$ language plpgsql;
答案 1 :(得分:0)
有意引用x
和y
吗?
COPY (SELECT * FROM retrieve_info('x','y')) TO 'myfilepath/test.csv'
您没有向x
发送y
的{{1}}和print_out
个参数 - 而是发送字符串retrieve_info
和{{1} }。假设你没有'x'
的记录,那就不奇怪你没有得到任何结果。
请改为尝试:
'y'