【问题标题】: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;
/

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    代码有什么错误

    • DECLARE 是函数/过程的无效语法。您想声明 IS 和 BEGIN 关键字之间的变量。
    • 那么您在prime_or_notPrime:= 1 和counter:= 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/…
    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2018-10-26
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多