让 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
是函数/过程的无效语法。您想声明 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/…以上是关于让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数的主要内容,如果未能解决你的问题,请参考以下文章