Oracle 使用过程和/或函数查找数字的指数(不使用POW或内置函数)

Oracle 使用过程和/或函数查找数字的指数(不使用POW或内置函数),oracle,plsql,Oracle,Plsql,我试图创建一种方法来找到一个数字的指数,在这种情况下,基数是4,指数是2,所以答案应该是16,使用一个过程,而不使用POW函数或任何内置函数来找到指数。最后,我想从用户那里获取输入号码 set serveroutput on; CREATE OR REPLACE PROCEDURE Exponent(base number, exponent number) as answer number; BEGIN base := 4; exponent := 2; LOOP

我试图创建一种方法来找到一个数字的指数,在这种情况下,基数是4,指数是2,所以答案应该是16,使用一个过程,而不使用POW函数或任何内置函数来找到指数。最后,我想从用户那里获取输入号码

    set serveroutput on;
CREATE OR REPLACE PROCEDURE Exponent(base number, exponent number) as
answer number;
BEGIN
   base := 4;
   exponent := 2;

   LOOP
   IF exponent > 1 THEN
        answer := base * base;
   END IF;
   END LOOP;
   dbms_output.put_line('Answer is: ' || answer);
END;
/
错误7,25:PLS-00103:表达式“BASE”不能用作分配目标,表达式“EXPONENT”不能用作分配目标

关于如何解决错误和/或在不使用过程库和指数中的内置函数(如POW)的情况下获取指数的更好方法的任何想法都是输入参数,无法更改。您有两个选择:

1将参数复制到程序内部的变量,并操纵这些内部值,或 2将参数更改为输入/输出参数,以便您可以更改它们

示例:

一,

二,


最好的是,无论Oracle提供什么样的内置功能,都能以尽可能好的方式达到目的。几乎所有比自定义代码更好的代码都尝试使用EXP函数。我试图根据我的理解来定制代码。希望这有帮助

    CREATE OR REPLACE
  FUNCTION EXP_DUMMY(
      BASE_IN IN NUMBER,
      EXPO_IN IN NUMBER)
    RETURN PLS_INTEGER
  AS
    lv PLS_INTEGER:=1;
  BEGIN
    FOR I IN
    (SELECT base_in COL1 FROM DUAL CONNECT BY level < expo_in+1
    )
    LOOP
      lv:=lv*i.col1;
    END LOOP;
    RETURN
    CASE
    WHEN EXPO_IN = 0 THEN
      1
    ELSE
      lv
    END;
  END;

SELECT EXP_DUMMY(2,4) FROM DUAL;

把庄家从你身边拿开。在我删除它之后,我似乎得到了错误:Error7,25:PLS-00103:在预期以下情况之一时遇到了符号过程:当前删除存在于插入符号之前,然后程序继续。我是否应该将此作为另一个问题发布?我们可以帮助您消除代码错误,但这似乎对您没有多大帮助。你试图找到指数是什么意思?你把它作为一个输入,那么为什么你需要找到它呢?你的意思是你在计算幂,而不是指数?然后,您的代码只是将基数乘以自身;如果指数等于或大于3,则计算错误。似乎在你对解决问题所需的数学有了清晰的概念之前,你就开始编码了。是的,数学是我也很难确定如何完成的。我想我可以使用一个循环来确保它将基数乘以正确的次数。如果我运行你问题中的代码,我得到:表达式“base”不能用作赋值目标,表达式“EXPONENT”不能用作赋值目标,这是有意义的,您不能将值分配给参数-所以您运行的显然与您向我们展示的不同。这仅仅是为了帮助解决语法错误吗?显然,base*base不会计算指数大于2的幂。从用户那里获取基数和指数是毫无意义的,只是在过程选项2中将它们更改为固定值。是的,它只是用来帮助语法。我强烈怀疑作业的目的是学习如何在不借助库函数的情况下进行幂运算,我决不会干涉别人的教育。事实证明,我确实有这样一个例程,但是,哦,该死,它是在Clojure Lisp变体中,要将它转换为PL/SQL真的很难。我怀疑这能不能做到…:-
CREATE OR REPLACE PROCEDURE Exponent(base IN OUT number,
                                     exponent IN OUT number) as
answer number;
BEGIN
   base := 4;
   exponent := 2;

   LOOP
   IF exponent > 1 THEN
        answer := base * base;
   END IF;
   END LOOP;
   dbms_output.put_line('Answer is: ' || answer);
END;
    CREATE OR REPLACE
  FUNCTION EXP_DUMMY(
      BASE_IN IN NUMBER,
      EXPO_IN IN NUMBER)
    RETURN PLS_INTEGER
  AS
    lv PLS_INTEGER:=1;
  BEGIN
    FOR I IN
    (SELECT base_in COL1 FROM DUAL CONNECT BY level < expo_in+1
    )
    LOOP
      lv:=lv*i.col1;
    END LOOP;
    RETURN
    CASE
    WHEN EXPO_IN = 0 THEN
      1
    ELSE
      lv
    END;
  END;

SELECT EXP_DUMMY(2,4) FROM DUAL;