我有下面的表格,名字为学生
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行
请帮我解决上述问题。
答案 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;