Oracle函数中的语法错误

问题描述 投票:-2回答:2

我正在尝试创建一个函数,将一个简单的insert放入一个名为poli的表中,这个函数的目的是:

  • 将值插入表时返回1
  • 在任何其他情况下,它返回0。

这是我写的oracle中的代码:

CREATE OR REPLACE FUNCTION ADDPOLI 
( ID IN NUMBER, NAME IN VARCHAR2 , LON IN FLOAT , LAT IN FLOAT , STATUS OUT NUMBER ) 
return status

          IS cursor poli_count is select count(id) from poli;

BEGIN

    declare number_of_cities int;

    fetch poli_c into number_of_cities;
if number_of_cities<= 15 and number_of_cities>=0 then
insert into poli values(id,name,lat,lon);
return 1;
else 
return 0;
end if;

END ADDPOLI;

我在这里有语法错误:将poli_c提取到number_of_cities;

我该怎么办呢?

oracle stored-functions
2个回答
2
投票

为什么要使用游标来实现这一目标。试试以下 -

CREATE FUNCTION ADDPOLI(ID INT, NAME VARCHAR(255), LON FLOAT, LAT FLOAT)
RETURNS INT
BEGIN

declare number_of_cities int;

select count(id) into number_of_cities from poli;
if number_of_cities between 0 and 15 then
    insert into poli values(id,name,lat,lon);
    return 1;
else 
    return 0;
end if;
END

1
投票

这里有一些更基本的关注点。在多用户环境(大多数数据库通常将运行)中部署此功能时会发生什么。

逻辑:

“我的城市少于15个吗?” “是的,插入另一行”

比第一次看起来更复杂。因为如果我有10个会话当前都运行此功能,您最终可能会遇到以下情况:

我开始说13行。然后这发生了:

  • 第一节:是否少于15?是的,做插入。
  • 第二节:是否少于15?是的,做插入。
  • 第3节:是否少于15?是的,做插入。
  • 第四节:是否少于15?是的,做插入。
  • 第五节:是否少于15?是的,做插入。
  • ...

现在第1节提交会议,等等,第2节,第3节......

瞧,瞧!你现在在你的桌子上有18行,每个人都对这是怎么回事感到困惑。

最终,您所追求的是一种强制执行数据规则的方法(“表X中最多15行”)。关于在AskTOM上做这件事的复杂性,有一个冗长的讨论

https://asktom.oracle.com/pls/asktom/asktom.search?tag=declarative-integrity

© www.soinside.com 2019 - 2024. All rights reserved.