Можно ли написать функцию и процедуру в одной программе на PL / SQL без использования пакетов? - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь вычислить LCM, используя GCF, но каким-то образом я получаю сообщение об ошибке, сказав, что «в области отсутствует функция с именем LCM».Что я могу с этим поделать?Я думаю, что эта ошибка, потому что я пишу процедуры и функции вместе ..

create or replace FUNCTION gcf (
    x   IN INTEGER,
    y   IN INTEGER
) RETURN INTEGER IS
    res   INTEGER;
BEGIN
    IF ( y = 0 ) OR MOD(y,x) = 0 THEN
        RETURN x;
    ELSIF ( x = 0 ) THEN
        RETURN y;
    ELSIF ( x < y ) THEN
        res := gcf(y,x);
    ELSE
        res := gcf(y,MOD(x,y) );
    END IF;

    RETURN res;
END;
/
create or replace PROCEDURE lcm (
    num1     IN INTEGER,
    num2     IN INTEGER,
    answer   OUT INTEGER
) IS

BEGIN
    IF num1 = 0 AND num2 = 0 THEN
        answer := 0;
    ELSE
        answer := abs(num1 * num2) / gcf(num1,num2);
    END IF;
END lcm;
/
DECLARE
c integer;
BEGIN
    dbms_output.put_line(' LCM(8, 12)-> ' || lcm(8, 12,c) );
    dbms_output.put_line(' LCM(38,150)-> ' || lcm(38,150,c) );
    dbms_output.put_line(' LCM(16,50)-> ' || lcm(16,60,c) );
    dbms_output.put_line(' LCM(16,60)-> ' || lcm(16,60,c) );
     dbms_output.put_line(' LCM(48,99)-> ' || lcm(48,99,c) );
END;
/

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Создайте процедуру и функцию внутри процедуры следующим образом:

create or replace PROCEDURE lcm (
    num1     IN INTEGER,
    num2     IN INTEGER,
    answer   OUT INTEGER
) IS
FUNCTION gcf (
    x   IN INTEGER,
    y   IN INTEGER
) RETURN INTEGER IS
    res   INTEGER;
BEGIN
    IF ( y = 0 ) OR MOD(y,x) = 0 THEN
        RETURN x;
    ELSIF ( x = 0 ) THEN
        RETURN y;
    ELSIF ( x < y ) THEN
        res := gcf(y,x);
    ELSE
        res := gcf(y,MOD(x,y) );
    END IF;

    RETURN res;
END;
BEGIN
    IF num1 = 0 AND num2 = 0 THEN
        answer := 0;
    ELSE
        answer := abs(num1 * num2) / gcf(num1,num2);
    END IF;
END lcm;
/

Затем вызовите ее:

DECLARE
   c   INTEGER;
BEGIN
   lcm (8, 12, c);
   DBMS_OUTPUT.put_line (' LCM(8, 12)-> ' || c);
   lcm (38, 150, c);
   DBMS_OUTPUT.put_line (' LCM(38,150)-> ' || c);
   lcm (16, 60, c);
   DBMS_OUTPUT.put_line (' LCM(16,50)-> ' || c);
   lcm (16, 60, c);
   DBMS_OUTPUT.put_line (' LCM(16,60)-> ' || c);
   lcm (48, 99, c);
   DBMS_OUTPUT.put_line (' LCM(48,99)-> ' || c);
END;
0 голосов
/ 03 октября 2018

Наименьшее общее кратное должно быть функцией (так как оно возвращает единственное значение):

CREATE FUNCTION lcm (
    num1     IN INTEGER,
    num2     IN INTEGER,
) RETURN INTEGER DETERMINISTIC
IS
BEGIN
  IF num1 = 0 AND num2 = 0 THEN
    RETURN 0;
  END IF;
  RETURN abs(num1 * num2) / gcf(num1,num2);
END lcm;
/

Тогда вы можете использовать код:

BEGIN
  dbms_output.put_line(' LCM(8, 12)-> ' || lcm(8, 12) );
  dbms_output.put_line(' LCM(38,150)-> ' || lcm(38,150) );
  dbms_output.put_line(' LCM(16,50)-> ' || lcm(16,60) );
  dbms_output.put_line(' LCM(16,60)-> ' || lcm(16,60) );
  dbms_output.put_line(' LCM(48,99)-> ' || lcm(48,99) );
END;
/
0 голосов
/ 03 октября 2018

Вы не можете использовать процедуру PL / SQL как функцию.Вы должны просто запустить его, не будучи частью какого-либо другого выражения, которое установит значение параметра out c.

DECLARE
c integer;

BEGIN
 lcm(8, 12,c);
    dbms_output.put_line(' LCM(8, 12)-> '  || c);

 lcm(38,150,c);
    dbms_output.put_line(' LCM(38,150)->' || c);

 lcm(16,60,c);
    dbms_output.put_line(' LCM(16,50)-> '  || c);

 lcm(16,60,c);
    dbms_output.put_line(' LCM(16,60)-> '  || c);

 lcm(48,99,c);

     dbms_output.put_line(' LCM(48,99)-> ' || c );
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...