我试图在postgres 9.3上使用sql调用函数内的函数。
这个问题与我的另一篇文章有关。
我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。
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
。但是,当在print_out()中将arg1,arg2替换为’mtd1’,’sp1’时,正确的输出将打印到test.csv(如下所示)
id | method | ind | location
----------------------------
1a | mtd1 | sp3 | locA
1d | mtd1 | sp3 | locB
我如何才能在print_out()中正确地获取retrieve_info()的arg1,arg2来正确调用arg1,arg2?
我完全被困住了。希望有任何指示,谢谢
COPY有点奇怪,因为query
即使它不是写为字符串,它也会将其参数视为字符串。结果是query
:
SELECT * FROM retrieve_info($1, $2)
不是在函数的上下文中执行,而是在COPY本身的上下文中执行。即使您说:
copy (select * from t) ...
就像您写的那样:
copy 'select * from t' ...
因此,在执行查询时,函数参数不再具有任何意义,query
COPY的参数可能看起来像是其他语言中的闭包,但实际上并没有,它的作用更像是将字符串传递给eval
。
您可以使用最后的手段Kludge:动态SQL来解决这种奇怪的情况。如果您编写函数以使用字符串wrangling和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;
问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。
我使用JDBC这样调用这个过程: 它向我抛出一个错误,通知调用格式错误。 但是如果我像这样直接在IDE中运行调用:
从1.r.58开始, 支持出参, 之前的版本仅支持入参. 从实现方式上说, 是通过扩展自定义SQL的含义及上下文来实现 仅含义入参的存储过程 // 建表,删除老的存储过程. dao.create(Pet.class, true); dao.insert(Pet.create("wendal")); dao.execute(Sqls.create("DROP PRO
问题内容: 昨晚我刚刚开始学习hibernate,它相当有趣。我在使用hibernate将存储过程作为sql查询调用时遇到麻烦。我已附上来源和错误,请帮助我。谢谢 :) 这是Java文件::: 错误是::: 问题答案: 我基本上不使用hibernate的getNamedQuery重新设计输入,但是java.sql类可以正常工作!
主要内容:创建CallableStatement对象,关闭CallableStatement对象,JDBC SQL转义语法在讨论JDBC Statement教程文章时,我们已经学习了如何在JDBC中使用存储过程。 本教程文章与该部分类似,但它将讲解演示有关JDBC SQL转义语法的其他信息。 就像对象创建和对象一样,它可使用同样的方式创建对象,该对象将用于执行对数据库存储过程的调用。 创建CallableStatement对象 假设需要执行以下Oracle存储过程 - 注意:上面的存储过程是为O
目前,我正在作业步骤中使用JdbcCursorItemReader和FlatFileItemWriter。 由于性能问题,我们不得不使用存储过程。 在Spring Batch 2.0中有没有一种方法可以调用存储过程。释放? ...其他配置 如何使用可调用语句编写自定义数据库读取器...感谢示例代码..谢谢,。