想要創建一個函式,該函式可以回傳包含數字資料型別的記錄,這些記錄是質數但收到編譯錯誤警告。代碼有什么錯誤。我是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;
/
uj5u.com熱心網友回復:
代碼中有什么錯誤
- 本
DECLARE是一個功能/程式無效的語法。您想宣告IS和BEGIN關鍵字之間的變數。 - 那么你
;在prime_or_notPrime:= 1and之后缺少一個陳述句終止符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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373082.html
上一篇:如何避免與case陳述句重復
