查询没有结果数据的目的地

时间:2014-05-15 07:14:46

标签: postgresql

我有下面的表格,名字为学生

     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   上下文:SQL语句中的PL / pgSQL函数fn_name(bigint)第6行

请帮我解决上述问题。

1 个答案:

答案 0 :(得分:3)

当前的问题是easily answered by the manual(请参阅SELECT INTO)。

然而,所有这些都是一种相当复杂的方式来做你想要的。事情特别错误:

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

  • SELECT RESULT "Name"不会做你认为它做的事情。我正在尝试SELECT名为result的列,并将其别名为Name。我想你正在寻找SELECT INTO

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

你真正需要的是:

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;
相关问题