首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SOCI不能准备语句

SOCI不能准备语句
EN

Stack Overflow用户
提问于 2014-08-11 08:50:21
回答 2查看 747关注 0票数 0

我有这样的功能:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION get_path_set_1(IN pathset_id_in character varying, OUT id character varying, OUT pathset_id character varying, OUT utility double precision)
  RETURNS SETOF record AS
$BODY$

    begin
        if exists(SELECT 1 FROM "PathSet_Scaled_HITS_distinctODs" WHERE "ID" = $1) then
            return query SELECT "ID", "PATHSET_ID", "UTILITY"
            FROM "SinglePath_Scaled_HITS_distinctODs"
            where "PATHSET_ID" = $1;
        end if; 
    end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION get_path_set_1(character varying)
  OWNER TO postgres;

当我在我的程序中调用它时,使用如下:

代码语言:javascript
复制
std::string testStr("43046,75502");// or std::string testStr("'43046,75502'");
soci::rowset<sim_mob::SinglePath> rs = (sql.prepare << "get_path_set_1(:pathset_id_in)",soci::use(testStr));

我得到以下例外:

代码语言:javascript
复制
terminate called after throwing an instance of 'soci::postgresql_soci_error'
  what():  Cannot prepare statement. ERROR:  syntax error at or near "get_path_set_1"
LINE 1: get_path_set_1($1)

如果你能帮我发现缺失的部分,我会很感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-11 12:03:15

从这段代码中:

代码语言:javascript
复制
soci::rowset<sim_mob::SinglePath> rs =
  (sql.prepare << "get_path_set_1(:pathset_id_in)",soci::use(testStr));

看起来,您正在准备一个只包含函数调用的查询,甚至连SELECT都没有。

这在SQL中无效。您需要准备这个查询,而不是:

代码语言:javascript
复制
 SELECT * FROM get_path_set_1(:pathset_id_in)

这个表单(select * from function(...))也是必要的,因为函数返回一个包含多列的结果集,而不仅仅是一个标量值。

同样,正如Erwin所提到的,在本例中,OUTSETOF RECORD是奇怪的,我将支持他关于使用RETURNS TABLE的建议。

票数 0
EN

Stack Overflow用户

发布于 2014-08-11 10:14:00

这不能解决您报告的错误。但是,简化您的功能:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION get_path_set_1(pathset_id_in varchar)
  RETURNS TABLE(id varchar, pathset_id varchar, utility double precision) AS
$func$
BEGIN
   RETURN QUERY
   SELECT "ID", "PATHSET_ID", "UTILITY"
   FROM   "SinglePath_Scaled_HITS_distinctODs"
   WHERE  "PATHSET_ID" = $1;
END
$func$  LANGUAGE plpgsql;
  • RETURNS TABLE是结合RETURNS SETOF recordOUT参数的现代、更优雅、等价的形式。
  • IF exists ...在这里什么都不给你买。运行查询;如果没有找到,则不会返回任何内容。一半的费用都是一样的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25239233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档