Как попросить пользователя ввести другое значение, пока пользователь не введет только положительное число в plsql - PullRequest
0 голосов
/ 10 июня 2018
CREATE OR REPLACE PROCEDURE findSquareRoot 
 ( v_num in NUMBER)
  is negative_Number Exception; 
BEGIN
    if(v_num<0) then
        RAISE negative_Number;
    else
        DBMS_OUTPUT.PUT_LINE ('Square root of '||v_num||' is'||SQRT(v_num));
    end if;
EXCEPTION
 WHEN negative_Number THEN
      RAISE_APPLICATION_ERROR(-20989,'Please provide a valid number');
END;

Тестовый блок с использованием цикла

DECLARE
  lv_input  NUMBER;
BEGIN
   LOOP
       lv_input := &num
       findSquareRoot(lv_input);
       EXIT WHEN lv_input > 0;
   END LOOP;
end;

Несмотря на то, что я упоминаю, что он должен выходить только тогда, когда ввод больше нуля, цикл выполняется только один раз.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Как вам сказали, PL / SQL здесь не поможет.

Если вы работаете в MS Windows, вы можете сделать это с помощью простого пакетного сценария.Вот как.

  • пакетный скрипт попросит пользователя ввести значение и будет продолжать это делать до тех пор, пока не будет введено положительное число
  • , как только вышеуказанное условие выполнено, он запускает SQL *Плюс и вызывает сценарий .SQL, который запускает процедуру, передавая параметр, введенный пользователем

Вот сценарии:

SQROOT.BAT

@echo off
:repeat
set /p numb="Enter a positive number : "
if %numb% lss 0 goto :repeat
sqlplus scott/tiger@orcl @sqroot %numb%

SQROOT.SQL

set serveroutput on
exec findSquareRoot(&1)

Ваша процедура

CREATE OR REPLACE PROCEDURE findsquareroot (v_num IN NUMBER)
IS
   negative_number   EXCEPTION;
BEGIN
   IF (v_num < 0)
   THEN
      RAISE negative_number;
   ELSE
      DBMS_OUTPUT.put_line (
         'Square root of ' || v_num || ' is ' || SQRT (v_num));
   END IF;
EXCEPTION
   WHEN negative_number
   THEN
      raise_application_error (-20989, 'Please provide a valid number');
END;
/

Тестирование:

M:\>sqroot
Enter a positive number : -2
Enter a positive number : 25

SQL*Plus: Release 11.2.0.1.0 Production on Pon Lip 11 08:35:47 2018

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

Square root of 25 is 5

PL/SQL procedure successfully completed.

SQL>

Это не идеально и может / должно быть улучшено, но - для краткости, надеюсь, у вас есть идея.

0 голосов
/ 11 июня 2018

в вашей логике - из вашего procedure findSquareRoot нет возвращаемого значения, оно заканчивается исключением;

CREATE OR REPLACE PROCEDURE findSquareRoot 
 ( v_num in out NUMBER)

    BEGIN
        if(v_num<0) then
            v_num:=0;
        else
            v_num:=1;
        end if;
    EXCEPTION
     WHEN others THEN
          dbms_outout.put_line(sqlcode);
    END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...