【问题标题】:Warning: execution completed with warning FUNCTION警告:执行完成并带有警告功能
【发布时间】:2015-02-25 21:25:30
【问题描述】:

我正在尝试创建一个函数来计算斐波那契数列的第 N 个元素。

CREATE OR REPLACE FUNCTION fib_mohamed_h(x number)
RETURN number IS
  f number;
DECLARE
  num number;
  fibbonnacci number
BEGIN
  IF (x<3) THEN
    f := 1;
  ELSE
    f := fib_mohamed_h(x-1)+fib_mohamed_h(x-2);
  END IF;
  RETURN f;
  x:= 3;
  fibbonnacci := fib_mohamed_h(x);
  dbms_output.put_line(' Fibbonnacci '|| x || ' is ' || fibbonnacci);
END;

这得到:

警告:执行完成但有警告 FUNCTION fib_mohamed_h(x 已编译。

我做错了什么?

【问题讨论】:

  • 请添加完整存储过程
  • 以及实际的错误;不确定这是哪个客户端,但您可以查询user_errors 视图以获取详细信息。
  • 我是一个新手,可以帮助我在 plsql 中计算斐波那契数列的第 N 个元素
  • 我认为问题不在于你的逻辑,而在于你如何创建函数。请编辑您的问题以显示 complete 函数创建语句,而不仅仅是它中间的那个小 sn-p。 ('Compiled' 消息使您看起来好像在 create 语句中错误地使用了双引号,但只显示整个内容,而来自 user_errors 的错误消息将使问题变得清晰)。
  • 顺便说一句,这部分:IF (x&lt;3) THEN 不正确。斐波那契函数应该为 0 返回 0,并且也有负数的值。如果您只想返回自然数的斐波那契数,那么当您的函数使用 0 或更少的数字调用时,您应该引发异常。

标签: sql oracle plsql


【解决方案1】:

您似乎已将函数声明和对函数的调用合并到一个无效块中。它看起来几乎像一个剪切和粘贴错误。按照你的逻辑,函数应该是:

CREATE OR REPLACE FUNCTION fib_mohamed_h(x number)
RETURN number IS
 f number;
BEGIN
  IF (x<3) THEN
    f := 1;
  ELSE
    f := fib_mohamed_h(x-1)+fib_mohamed_h(x-2);
  END IF;
  RETURN f;
END;
/

电话可能是:

set serveroutput on size unlimited
DECLARE
  x number;
  fibbonnacci number;
BEGIN
  x:= 3;
  fibbonnacci := fib_mohamed_h(x);
  dbms_output.put_line(' Fibbonnacci '|| x || ' is ' || fibbonnacci);
END;
/

anonymous block completed
 Fibbonnacci 3 is 2

或者从简单的 SQL:

SELECT fib_mohamed_h(7) FROM dual;

FIB_MOHAMED_H(7)
----------------
              13 

SQL Fiddle demo.

Read more about how to create functions.

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2021-08-19
    • 2017-04-16
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多