PL/SQL函数,用于检查数字是否为素数

PL/SQL函数,用于检查数字是否为素数,sql,oracle,plsql,Sql,Oracle,Plsql,请查找错误并更正此代码 这是一个PL/SQL函数,用于检查数字是否为素数 通过使用flag方法而不是使用count来检查需求,它工作得很好,但不适用于此方法 create or replace function isprime(x in number) RETURN number IS i int; count int; BEGIN count:=0; for i in 2..x/2 LOOP if mod(x,i)=0 then count:=count+1; end if; end loop

请查找错误并更正此代码

这是一个PL/SQL函数,用于检查数字是否为素数 通过使用flag方法而不是使用count来检查需求,它工作得很好,但不适用于此方法

create or replace function isprime(x in number)
RETURN number
IS
i int;
count int;
BEGIN
count:=0;
for i in 2..x/2 LOOP
if mod(x,i)=0 then
count:=count+1;
end if;
end loop;
return count;
end;
/
Warning: Function created with compilation errors.

DECLARE
n int;
c int;
BEGIN
n:=&n;
c:=isprime(n);
if c=0 then
dbms_output.put_line(n||'is a prime number');
else
dbms_output.put_line(n||'is not prime');
end if;
end;
/

Enter value for n: 5
old   5: n:=&n;
new   5: n:=5;
c:=isprime(n);
   *
ERROR at line 6:
ORA-06550: line 6, column 4:
PLS-00905: object SYSTEM.ISPRIME is invalid
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored
以下是错误列表:

SQL> show errors
Errors for FUNCTION ISPRIME:

LINE/COL ERROR
-------- -----------------------------------------------------------------
10/1     PL/SQL: Statement ignored
10/8     PLS-00204: function or pseudo-column 'COUNT' may be used inside a
         SQL statement only

13/1     PL/SQL: Statement ignored
13/8     PLS-00204: function or pseudo-column 'COUNT' may be used inside a
         SQL statement only

COUNT是保留sql word,请将其作为此任务的替代解决方案

DECLARE
  value_   NUMBER default :A;
  i     NUMBER DEFAULT 5;
  is_prime VARCHAR2(5 CHAR);
BEGIN
  IF value_ = 2 OR value_ = 3 THEN
  is_prime := 'TRUE';
  ELSIF MOD(value_,2)=0 OR MOD(value_,3)=0 OR value_ <= 1 THEN
  is_prime := 'FALSE';
  END IF;
  
  WHILE POWER(i,2) <= value_ LOOP
  IF MOD(value_,i)=0 OR MOD(value_,i + 2)=0 THEN 
  is_prime := 'FALSE';
  exit;
  END IF;
  i := i + 6;  
  end loop;
  is_prime := nvl(is_prime,'TRUE');  
  DBMS_Output.Put_Line(is_prime||' IT IS '||CASE is_prime WHEN 'FALSE' THEN 'NOT' END||'A PRIME NUMBER');
END;
声明
值\编号默认值:A;
i数字默认为5;
是素数VARCHAR2(5个字符);
开始
如果值=2或值=3,则
is_prime:=“真”;

如果MOD(value,2)=0或MOD(value,3)=0或value,您可以维护一个包含所有素数的索引表,有点像日历表方法。这将避免到处都是丑陋和无性能的UDF调用。
COUNT
是一个保留的SQL字。只需使用不同的名称,例如
v_count
(在PL/SQL中,前缀v通常用于变量名)。顺便说一句,如果缩进正确,代码的可读性会更好。@TimBiegeleisen所有素数?:-)@TonyAndrews这取决于OP期望的数字有多大,但我是这样建议的。这将是一个大表:D类型
数字
允许38位,因此如果我没有弄错的话,这将超过一个不确定的素数。(我必须用谷歌搜索这两个数字,一个近似计数的公式和10^36:-)另一方面:对于这样大的数字,用PL/SQL计算也需要一些时间:D