【问题标题】:Syntax Error In Oracle FunctionOracle 函数中的语法错误
【发布时间】:2017-12-16 16:42:38
【问题描述】:

我正在尝试将一个简单的函数 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;

我该如何解决?

【问题讨论】:

  • 你的数据库是 MySQL 还是 Oracle?我看到您有 VARCHAR2 和 NUMBER,它们是 Oracle 数据类型,MySQL 无法识别。但是你的主题和标签说的是 mysql。
  • 它的神谕,对不起

标签: oracle stored-functions


【解决方案1】:

为什么要使用光标来实现这一点。试试下面 -

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

【讨论】:

  • @phill 立即尝试。
  • 我也会修正数据类型。
  • 很抱歉花时间编辑您的答案并在 MySQL 上对其进行测试。 OP 正在使用 Oracle。
  • 对不起,我是数据库新手,非常抱歉浪费您的时间
【解决方案2】:

这里有一些更根本的问题。当您在多用户环境(大多数数据库通常会在其中运行)中部署此功能时会发生什么。

逻辑:

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

比最初出现的要复杂。因为如果我当前有 10 个会话都在运行此功能,那么您最终可能会遇到以下情况:

我从 13 行开始。然后会发生这种情况:

  • 会话 1:是否少于 15 个?是的,做插入。
  • 会话 2:是否少于 15 个?是的,做插入。
  • 会话 3:是否少于 15 个?是的,做插入。
  • 会话 4:是否少于 15 个?是的,做插入。
  • 会话 5:是否少于 15 个?是的,做插入。
  • ...

现在 会话 1 提交,等等会话 2、3、...。

因此瞧!现在您的表中有 18 行,每个人都对这是如何发生的感到困惑。

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

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

【讨论】:

  • 不知道这实际上是可能的,“会话”代表什么?连接用户?还是“交易”?
  • 会话是与数据库的连接。这可能与实际用户是一对一的,但更有可能是“真实用户”正在使用的连接池的成员之一。显然,插入和提交之间的时间通常很短,但这只是降低了损坏发生的可能性,而不是消除它
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多