让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数

Posted

技术标签:

【中文标题】让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数【英文标题】:For oracle function to know if data is prime or not. Getting Warning: Function created with compilation errors让 oracle 函数知道数据是否为素数。收到警告:创建时出现编译错误的函数 【发布时间】:2021-12-03 14:27:17 【问题描述】:

想要创建一个函数,该函数可以返回包含数字数据类型的记录,这些记录是质数 但是收到编译错误的警告。代码中的错误是什么。我是pl/sql的初学者。

CREATE OR REPLACE FUNCTION isPrime (num number)
RETURN number
IS
retVal number;
BEGIN
DECLARE
prime_or_notPrime number;
counter number;
    retVal:= 1;
    prime_or_notPrime:= 1
    counter:= 2
    WHILE (counter <= num/2)  LOOP
        IF (mod(num ,counter)= 0)  THEN
            prime_or_notPrime: = 0
            EXIT;
        END IF;
        IF (prime_or_notPrime = 1 ) THEN
            retVal: = 1;
        counter: = counter + 1
        END IF;
    END LOOP;
    return retVal;
END;
/

【问题讨论】:

【参考方案1】:

代码有什么错误

DECLARE 是函数/过程的无效语法。您想声明 ISBEGIN 关键字之间的变量。 那么您在prime_or_notPrime:= 1counter:= 2 之后缺少; 语句终止符。 那么你有: prime_or_notPrime: = 0 而不是 prime_or_notPrime := 0; retVal: = 1; 而不是 retVal := 1;counter: = counter + 1 而不是 counter := counter + 1;(它们在 := 之间都有一个空格,有些又缺少 ;)。 您永远不会将 retVal 设置为 1 以外的任何值。 您不处理 NULL 值或小于 2 的值。

修复它(和缩进)给出:

CREATE OR REPLACE FUNCTION isPrime (num number)
RETURN number
IS
  retVal number;
  prime_or_notPrime number;
  counter number;
BEGIN
  IF NUM IS NULL OR NUM < 2 THEN
    RETURN 0;
  END IF;

  retVal:= 1;
  prime_or_notPrime:= 1;
  counter:= 2;
  WHILE (counter <= num/2)  LOOP
    IF (mod(num ,counter)= 0)  THEN
      prime_or_notPrime := 0;
      retVal := 0;
      EXIT;
    END IF;
    IF (prime_or_notPrime = 1 ) THEN
      counter := counter + 1;
    END IF;
  END LOOP;
  return retVal;
END;
/

注意:prime_or_notprime 变量不会控制任何东西,因为一旦你将它设置为0,你就从循环中将EXIT 设置为不会再次使用它。注意到这一点后,您可以去掉最后的 IF 语句,而只增加计数器。


您可以将其简化为:

CREATE OR REPLACE FUNCTION isPrime (
  num number
) RETURN number DETERMINISTIC
IS
BEGIN
  IF NUM IS NULL OR NUM < 2 THEN
    RETURN 0;
  END IF;

  FOR counter IN 2 .. SQRT(num)  LOOP
    IF MOD(num, counter) = 0  THEN
      RETURN 0;
    END IF;
  END LOOP;
  RETURN 1;
END;
/

然后您可以考虑改进。例如,首先检查2 作为特例,然后跳过所有其他偶数。

db小提琴here

【讨论】:

... 然后,进行更多改进:检查 3,然后跳过所有 3 的倍数,等等。Eratosthenes 的筛子是 Oracle 讨论板的主要贡献者找不到的问题之一一个好的纯 SQL 解决方案;它很容易在 PL/SQL 中实现。 community.oracle.com/tech/developers/discussion/3931268/…

以上是关于让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数的主要内容,如果未能解决你的问题,请参考以下文章

50~100之间的素数,判断是不是为素数用函数完成

新手求教 c语言素数判断算法

如何创建 Azure 警报以通知任何资源删除

素数筛选

在使用列表推导生成素数时使用`all()`函数

如何让用户选中一个框以授予权限,而不是用户在 React-Native 中的警报上单击确定?