不使用包就可以在PL / SQL的单个程序中编写函数和过程吗?

时间:2018-10-03 03:36:40

标签: oracle plsql

我正在尝试使用GCF计算LCM,但不知何故我收到错误消息,说“范围内不存在名称为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 :(得分:1)

不能像函数一样使用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;
/

答案 1 :(得分:0)

在过程中创建过程和函数,如下所示:

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;

答案 2 :(得分:0)

最低公倍数应该是一个函数(因为它返回一个值):

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;
/