PL/SQL函数,用于检查数字是否为素数
请查找错误并更正此代码 这是一个PL/SQL函数,用于检查数字是否为素数 通过使用flag方法而不是使用count来检查需求,它工作得很好,但不适用于此方法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
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