gpt4 book ai didi

sql - PL/pgSQL 函数异常

转载 作者:行者123 更新时间:2023-11-29 13:32:47 28 4
gpt4 key购买 nike

我有一个关于 PL/pgSQL 异常的小问题。我的任务是编写一个函数来查找具有一定长度的水库。

我的代码:

create or replace function
info_about_reservoir(num_of_letters int)
returns int as
$$
declare
res_name varchar(50);
res_type varchar(50);
res_area decimal(10,0);
counter int := 1;
begin
select r_name,t_name,r_area into strict res_name,res_type,res_area
from
reservoirs right outer join reservoirs_types
on t_id=r_t_id
where char_length(r_nazwa)=$1;
raise notice 'Name: %, type: %, area: %',res_name,res_type,res_area;
exception
when no_data_found then
raise notice 'No reservoir with name lenght %',$1;
when too_many_rows then
raise notice 'Too much reservoirs with name lenght %',$1;
return counter;
end;
$$ language plpgsql;

对于 num_of_letters 必须返回异常: --SELECT info_about_reservoir(7) -- no_data_found --SELECT info_about_reservoir(8) -- too_many_rows --SELECT info_about_reservoir(9) -- 姓名:% ...

在此脚本的先前版本中,我只返回异常和错误:查询没有结果数据的目的地。现在它返回对于 7: 姓名: ...对于 8:名称:某些行查询的第一行 ...for 9: Name: row from one row query ...


对不起,我有一个答案:

create or replace function
info_about_reservoir(num_of_letters int)
returns int as
$$
declare
res_name varchar(50);
res_type varchar(50);
res_area int;
counter int := 1;
begin
select r_name,t_name,r_area into strict res_name,res_type,res_area
from
reservoirs right outer join reservoirs_types
on t_id=a_t_id
where char_length(r_name)=$1;
raise notice 'Name: %, type: %, area: %',res_name,res_type,res_area;
return counter;
exception
when no_data_found then
raise notice 'No reservoir with name lenght %',$1;
return counter;
when too_many_rows then
raise notice 'Too much reservoirs with name lenght %',$1;
return counter;
end;
$$ language plpgsql;

现在可以了。 :D

最佳答案

基于关于您缺失的表定义的假设。

最新版本中的 RIGHT [OUTER] JOIN 没有任何用处。由于条件在左表中,您也可以使用 [INNER] JOIN。 你真的想要一个 LEFT JOIN 吗?那么没有匹配 reservoirs_type 的 reservoirs 是否仍然被返回?

STRICT modifier in SELECT INTO仅考虑是否返回单行,它不会对 LEFT JOIN 中的缺失行使用react(或为单个列分配 NULL 值。

可能看起来像:

CREATE OR REPLACE FUNCTION info_about_reservoir(num_of_letters int)
RETURNS int AS
$func$
DECLARE
res_name text;
res_type text;
res_area int;
counter int := 1;
BEGIN
SELECT r_name, t_name, r_area -- no table-qualification for lack of info
INTO STRICT res_name, res_type, res_area
FROM reservoirs r
<b>LEFT JOIN</b> reservoirs_types t ON t_id = a_t_id -- OR JOIN, not RIGHT JOIN
WHERE length(r_name) = $1;

RAISE NOTICE 'Name: %, type: %, area: %', res_name, res_type, res_area;
RETURN counter;

EXCEPTION
WHEN no_data_found THEN
RAISE NOTICE 'No reservoir with name length %.', $1;
RETURN counter;
WHEN too_many_rows THEN
RAISE NOTICE 'Too many reservoirs with name length %.', $1;
RETURN counter;
END
$func$ LANGUAGE plpgsql;
  • counter 始终为 1。目的是什么?

关于sql - PL/pgSQL 函数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19773973/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com