【问题标题】:PLSQL Function declarationPLSQL 函数声明
【发布时间】:2013-04-23 19:04:15
【问题描述】:

我想接受一个数字并返回两倍的参数值。 虽然我希望它遵循

float timestwo(float num){ num*2;返回数字;}

然而,

plsql 似乎需要一种更加模糊的方法。我以为我遵循了 oracle 11g 要求的方法,但是在尝试执行以下代码时,

exec dbms_output.enable(1000000); --boilerplate
set serveroutput on           --boilerplate
CREATE OR REPLACE FUNCTION timestwo (num
IN number)
RETURN number IS
   product number(2) := 0;
BEGIN
   product := (num*2);
   RETURN product;
END;
/
EXECUTE timestwo(5);
show error                       --boilerplate

dbms 抛出以下错误:

ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00221: 'TIMESTWO' is not a procedure or is undefined
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
No errors

显然函数声明不正确,但有人知道如何正确实现这个简单的代码吗?

【问题讨论】:

    标签: sql oracle function variables plsql


    【解决方案1】:

    该函数有效,但您调用它不正确。您已经定义了一个函数。但是正如错误所暗示的那样,您将其称为过程。

    你可以这样做:

    select timestwo(5) from dual;
    

    或者在 SQL*Plus 中:

    var result number;
    exec :result := timestwo(5);
    print result
    

    您的函数实际上不需要定义product 变量;你可以稍微简化为:

    create or replace function timestwo(num in number)
    return number is
    begin
        return num*2;
    end;
    /
    

    ...对于较大的输入数字(如10)也不会出错,因为它提供了超过两位数的产品。除非这是故意的,当然... *8-)

    【讨论】:

    • 我不知道是函数调用出了问题!也许错误说是第 11 行而不是第 1 行,它会更明显一点!谢谢!
    • @Duncan - createexecute 是两个单独的语句,错误在第二个语句的第 1 行。 exec 只是一个 SQL*Plus 简写,扩展为 begin timestwo(5); end;,这并不明显,我以为错误显示了全部内容。其中的字符 7 是函数名称中最合适的 t - 这也可能增加了混乱。
    • 发生错误后,可以使用list 查看SQL*Plus 发送的内容,其中行号与错误中的行号匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2014-05-25
    • 2010-12-24
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多