我试图在一个名为insert
的表中创建一个执行简单poli
的函数,这个函数的目的是:
这是我写的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;
我该如何解决?
答案 0 :(得分: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 :(得分:1)
这里有一些更基本的问题。在多用户环境中部署此功能时会发生什么(大多数数据库通常会在其中运行)。
逻辑:
“我的城市少于15个吗?” “是的,插入另一行”
比第一次出现更复杂。因为如果我有10个会话当前都运行此功能,您最终可能会遇到以下情况:
我先说13行。然后发生这种情况:
和现在会话1提交,等等,用于会话2,3,....
因此瞧!你现在在你的表中有18行,每个人都对这种情况感到困惑。
最终,您所追求的是一种强制执行数据规则的方法(“表X中最多15行”)。关于在AskTOM上做这件事的复杂性,有一个冗长的讨论
https://asktom.oracle.com/pls/asktom/asktom.search?tag=declarative-integrity