【问题标题】:query has no destination for result data [duplicate]查询没有结果数据的目的地[重复]
【发布时间】:2014-05-15 07:14:45
【问题描述】:

我有如下表,名字是学生

     S.No    Name 
      1.    Ramesh
      2.    Raju
      3.    SOmu
    -------------
    -------------  etc

我的要求是当我传递 S.no 时,我将使用函数获取名称

我的功能如下:

CREATE OR REPLACE FUNCTION fn_name(v_sno bigint)
  RETURNS TEXT
  AS
$BODY$

    DECLARE RESULT  VARCHAR(5000);

    BEGIN   
        SELECT  RESULT  "Name"  FROM "Student" WHERE "s.no" = v_sno;

        RETURN RESULT;
     END;

 $BODY$
  LANGUAGE plpgsql
  COST 100;
ALTER FUNCTION fn_name(bigint)
  OWNER TO postgresql

但我收到以下错误。

错误:查询没有结果数据的目的地
SQL 状态:42601
提示:如果要丢弃 SELECT 的结果,请改用 PERFORM。
上下文:PL/pgSQL 函数 fn_name(bigint) 第 6 行 SQL 语句

请帮助我如何解决上述问题。

【问题讨论】:

  • 您好,我从未见过您希望在其中存储数据的对象被放入这样的 sql 语句中。 (选择结果“名称”)
  • 手册有什么问题?只需复制/粘贴其中一个示例,稍作更改即可完成。
  • 创建或替换函数 fn_name(v_sno bigint) 将文本返回为 $BODY$ DECLARE RESULT VARCHAR(5000); BEGIN SELECT "Name" into RESULT FROM "Student" WHERE "s.no" = v_sno;返回结果;结尾; $BODY$ 语言 plpgsql 成本 100; ALTER FUNCTION fn_name(bigint) OWNER TO postgresql

标签: postgresql


【解决方案1】:

直接的问题是easily answered by the manual(见SELECT INTO)。

然而,所有这些都是一种相当复杂的方式来做你想做的事。明显错误的地方:

  • varchar(5000) 很奇怪而且没必要。使用text 或不合格的varchar

  • SELECT RESULT "Name" 没有做你可能认为的事情。这试图SELECT 一个名为result 的列并将其别名为Name。我想你在找SELECT INTO

  • "s.no" 表示名为s.no 的列。这是你的意思吗?因为那是一个可怕的列名;如果没有引号,它将被解释为表s 中的列no。不要在列名或表名中使用句点。

你真正需要的是:

CREATE OR REPLACE FUNCTION fn_name(bigint)
RETURNS TEXT AS
$BODY$
SELECT "Name" FROM "Student" WHERE "s.no" = $1;
$BODY$
LANGUAGE sql;

(假设 "s.no" 确实是您的列名,而不是对别名的错误尝试)。

如果你因为某种原因不得不使用 PL/PgSQL 来完成这个简单的工作(也许你打算以后让它变得更复杂),你会写:

CREATE OR REPLACE FUNCTION fn_name(v_sno bigint)
RETURNS TEXT AS
$BODY$
DECLARE
    result text;
BEGIN
    SELECT INTO result "Name" FROM "Student" WHERE "s.no" = $1;
    RETURN result;
END;
$BODY$
LANGUAGE plpgsql;

【讨论】:

  • 将函数 fn_name 所有者更改为 postgresql
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 2023-03-06
相关资源
最近更新 更多