Oracle 函数中的语法错误
Syntax Error In Oracle Function
我正在尝试将一个简单的 insert
函数转换成一个名为 poli
的 table,此函数的目的:
- returns 1 将值插入 table
- 在任何其他情况下它 returns 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;
i have a syntax error here: fetch poli_c into number_of_cities;
我该如何解决?
为什么要使用游标来实现此目的。试试下面 -
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
这里有一些更根本的问题。当您在多用户环境中部署此功能时会发生什么(大多数数据库通常 运行 在其中)。
逻辑:
"Do I have less than 15 cities?"
"Yes, insert another row"
比第一次出现的要复杂。因为如果我目前有 10 个会话 运行 使用此功能,您可能会遇到以下情况:
我从 13 行开始。然后会发生这种情况:
- 第 1 节:是否少于 15 个?是的,做插入。
- 第 2 节:是否少于 15 个?是的,做插入。
- 第 3 节:是否少于 15 个?是的,做插入。
- 第 4 节:是否少于 15 个?是的,做插入。
- 第 5 节:是否少于 15 个?是的,做插入。
- ...
和现在 会话 1 提交,会话 2、3 等等……
因此瞧!您现在 table 中有 18 行,每个人都对这是怎么发生的感到困惑。
最终,您所追求的是一种强制执行有关数据的规则的方法 ("max of 15 rows in table X")。在 AskTOM
上对这样做的复杂性进行了长时间的讨论
https://asktom.oracle.com/pls/asktom/asktom.search?tag=declarative-integrity
我正在尝试将一个简单的 insert
函数转换成一个名为 poli
的 table,此函数的目的:
- returns 1 将值插入 table
- 在任何其他情况下它 returns 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;
i have a syntax error here: fetch poli_c into number_of_cities;
我该如何解决?
为什么要使用游标来实现此目的。试试下面 -
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
这里有一些更根本的问题。当您在多用户环境中部署此功能时会发生什么(大多数数据库通常 运行 在其中)。
逻辑:
"Do I have less than 15 cities?" "Yes, insert another row"
比第一次出现的要复杂。因为如果我目前有 10 个会话 运行 使用此功能,您可能会遇到以下情况:
我从 13 行开始。然后会发生这种情况:
- 第 1 节:是否少于 15 个?是的,做插入。
- 第 2 节:是否少于 15 个?是的,做插入。
- 第 3 节:是否少于 15 个?是的,做插入。
- 第 4 节:是否少于 15 个?是的,做插入。
- 第 5 节:是否少于 15 个?是的,做插入。
- ...
和现在 会话 1 提交,会话 2、3 等等……
因此瞧!您现在 table 中有 18 行,每个人都对这是怎么发生的感到困惑。
最终,您所追求的是一种强制执行有关数据的规则的方法 ("max of 15 rows in table X")。在 AskTOM
上对这样做的复杂性进行了长时间的讨论https://asktom.oracle.com/pls/asktom/asktom.search?tag=declarative-integrity