Простое число с помощью оператора GOTO в PL / SQL - PullRequest
2 голосов
/ 02 октября 2019

Это мой код для простого числа с использованием оператора goto

set serveroutput on;
SQL>
SQL> declare
  2  msg varchar2 (30);
  3  n pls_integer := 83;
  4
  5  begin
  6  for i in 2..round( sqrt(n) ) loop
  7  if n mod i=0 then
  8  msg := ' is not a prime number';
  9  goto when_prime;
 10  end if;
 11  end loop;
 12
 13  msg := ' is a prime number';
 14
 15  <>
 16  dbms_output.put_line(to_char(n) || msg);
 17  end;
 18  /

Я получаю следующую ошибку:

<>
*
ERROR at line 15:
ORA-06550: line 15, column 1:
PLS-00103: Encountered the symbol ">" when expecting one of the following:
( begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
ORA-06550: line 16, column 40:
PLS-00103: Encountered the symbol ";" when expecting one of the following:
. ( ) , * % & - + / at mod remainder rem <an exponent (**)>
and or || multiset

Я хочу проверить простое число или не простое числоиспользуя оператор goto

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

Вы неправильно декларируете метку when_prime.

Просто замените это:

<>

на:

<<when_prime>>

Демонстрация по БД Fiddle :

dbms_output:
83 is a prime number
0 голосов
/ 02 октября 2019

Вы неправильно использовали раздел объявления метки, он должен быть заключен в << >>, а не < >

Ваш код должен выглядеть примерно так:

SQL> DECLARE
  2      MSG   VARCHAR2(30);
  3      N     PLS_INTEGER := 83;
  4  BEGIN
  5      FOR I IN 2..ROUND(SQRT(N)) LOOP
  6          IF N MOD I = 0 THEN
  7              MSG := ' is not a prime number';
  8              GOTO WHEN_PRIME;
  9          END IF;
 10      END LOOP;
 11
 12      MSG := ' is a prime number';
 13      << WHEN_PRIME >>
 14      DBMS_OUTPUT.PUT_LINE(TO_CHAR(N) || MSG);
 15  END;
 16  /
83 is a prime number

PL/SQL procedure successfully completed.

SQL>

ОБНОВЛЕНИЕ- Важно

Может не иметь отношения к получаемой ошибке, но вы можете напрямую использовать следующий запрос, чтобы найти простое число:

SQL> WITH NUMBR AS (SELECT 83 NUMBR FROM DUAL)
  2  SELECT NUMBR,
  3         CASE WHEN SUM(CASE WHEN MOD(NUMBR, LEVEL) = 0
  4                       THEN 1 END) = 1
  5              THEN 'prime'
  6              ELSE 'not prime'
  7        END AS "Prime?"
  8  FROM NUMBR
  9  CONNECT BY LEVEL <= FLOOR(NUMBR / 2)
 10  GROUP BY NUMBR;

     NUMBR Prime?
---------- ---------
        83 prime

SQL>

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...