【问题标题】:PostgreSQL: Query has no destination for result dataPostgreSQL:查询没有结果数据的目的地
【发布时间】:2014-05-30 03:51:45
【问题描述】:

我正在尝试通过函数使用 dblink 从远程数据库获取数据,但收到错误“查询没有结果数据的目的地”。我正在使用 plpgsql 语言来做同样的事情。

功能

CREATE OR REPLACE FUNCTION fun()
  RETURNS text AS
$$
begin
select dblink_connect(
      'port=5432 dbname=test user=postgres password=****');

WITH a AS (
SELECT *
FROM dblink(
    'SELECT slno,fname,mname,lname
    FROM    remote_tbl'
     ) AS t (slno int, fname text, mname text, lname text)
)
, b AS (
INSERT INTO temptab1
SELECT slno, name
FROM   a
)
, c AS (
INSERT INTO temptab2
SELECT slno, name
FROM   a
)
INSERT INTO temptab3
SELECT slno, name
FROM   a;


select dblink_disconnect();
end;
$$ 
LANGUAGE plpgsql;

调用函数

select fun();

错误:查询没有结果数据的目的地

【问题讨论】:

标签: postgresql common-table-expression dblink


【解决方案1】:

存储过程不会只返回最后一个 SELECT 的结果。您需要实际返回值:

CREATE OR REPLACE FUNCTION fun() RETURNS text AS $$
BEGIN
    --- ....
    RETURN(SELECT dblink_disconnect());
END
$$ LANGUAGE plpgsql;

您收到错误是因为 Postgres 期望函数返回文本类型的内容,但您的函数没有返回任何内容。

【讨论】:

  • 请显示您当前的代码,我们看不到它...您是否也更改了“select dblink_connect”?每个结果都必须有一个目的地或使用 PERFORM 而不是 SELECT。
  • @Frank Heikens,+1 是的,我明白了。好!非常感谢。
【解决方案2】:

使用普通的 SQL 函数代替 PL/PgSQL,或者使用SELECT INTO 和普通的RETURN

【讨论】:

    【解决方案3】:

    您收到错误的原因是您的 BEGINEND 之间没有 return,例如:

        BEGIN
            update mytable set lastcodeused = to_char(cast(lastcodeused as INTEGER)+1, 'FM999999999999999999') where 
            classid = classIdVar and appid= appIdInt 
            RETURNING concat(pageUniqueCode,lastcodeused) as pageUniqueCode
            into taskcode;
            return taskcode;
        END;
    

    【讨论】:

      猜你喜欢
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多