【问题标题】:Function/Package issue PL/SQL函数/包问题 PL/SQL
【发布时间】:2013-04-09 02:43:25
【问题描述】:

我正在尝试创建一个具有四个功能的包。每个函数将添加一组数字并从总数中减去一个。我在语法正确时遇到了很多麻烦。下面的函数独立工作,我尝试在最后调用第一个函数。

当我尝试创建包时,在第 7 行出现错误,“在预期以下情况之一时遇到符号“END”:开始函数杂注过程子类型当前光标删除在 0.05 秒之前存在”

在包正文中它说“名称已被现有对象使用”。我不明白,因为无论如何它都必须在包的规范中声明,如果错误是已经有一个名为 functionbyfour 的包,那么 create 或 replace 应该可以解决这个问题。

最后,当我尝试使用包中的一个函数时,它显示“在预期以下之一时遇到符号“BEGIN”::=。(@%;不是空范围默认字符符号“;”被替换为“BEGIN”以继续。ORA-06550:第 5 行,第 43 列:PLS-00103:在预期以下情况之一时遇到符号“FROM”:. ( * % & = - + ; at in是 mod 余数不是 rem 或 != 或 ~= >= and or like2 like4 likec between || multiset me"。

我正在使用 ORACLE EXPRESS 版本 11g,并且是 PL/SQL 新手(4 周)。

非常感谢任何输入。

CREATE OR REPLACE FUNCTION functionbyfour AS

 FUNCTION functone( first number, second number) RETURN NUMBER ;
 FUNCTION functtwo( first number, second number, third number) RETURN NUMBER ;
 FUNCTION functthree(first number, second number, third number, fourth number) RETURN     NUMBER ;
 FUNCTION functfour( first number, second number, third number, fourth number,fifth   number) RETURN NUMBER ;

END  functionbyfour;
/

CREATE OR REPLACE PACKAGE functionbyfour AS

FUNCTION functone (first number, second number ) RETURN number AS total number;
 BEGIN
total:=first + second – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functone;


FUNCTION functtwo (first number, second number, third number ) RETURN number AS  total     number;
BEGIN
total:=first + second + third – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functtwo;

FUNCTION functthree (first number, second number,third number, fourth number )     RETURN     number AS total number;
BEGIN
total:=first + second + third + fourth – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functthree;


FUNCTION functfour (first number, second number, third number, fourth number, fifth     number ) RETURN number AS total number;
BEGIN
total:=first + second + third + fourth + fifth – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functfour;

/

BEGIN

SELECT functionbyfour.functone(1,2) FROM DUAL;

END;

/​

【问题讨论】:

    标签: sql oracle function plsql package


    【解决方案1】:
    1. 线

      CREATE OR REPLACE FUNCTION functionbyfour AS
      

      应该是

      CREATE OR REPLACE PACKAGE functionbyfour AS
      
    2. 线

      CREATE OR REPLACE PACKAGE functionbyfour AS
      

      应该是

      CREATE OR REPLACE PACKAGE BODY functionbyfour AS
      
    3. 第二个字是关键字,不能作为参数名使用

    4. 你需要一个

      END functionbyfour;
      

      在你的 END 函数之后结束包体

    5. 您的 dbms_outputs 在返回后将永远不会被执行

    6. 您可以在一个函数中完成所有这些操作

       FUNCTION functall(FIRST NUMBER
                           ,sec NUMBER DEFAULT 0
                           ,third NUMBER DEFAULT 0
                           ,fourth NUMBER DEFAULT 0
                           ,fifth NUMBER DEFAULT 0)
        RETURN NUMBER
      AS
        total NUMBER;
      BEGIN
        total := first + sec + third + fourth + fifth - 1;
      
        dbms_output.PUT_LINE(total);
      
        RETURN total;
      END functall;
      
    7. 想要做什么奇怪的事情? :-)

    【讨论】:

    • 感谢您的输入,不确定 second 是否是关键字,(它没有突出显示并且似乎有效)。这是一项任务,谁知道教授的想法?你的代码似乎更容易一些,但他说他想要一个有四个功能的包,所以我不会和他争论。
    • 是的,当我说“不能”时,我应该说“不应该”,如果您打开了 plsql 警告并检查用户错误,您将收到警告 PLW-06010:关键字“SECOND”用作定义的名称
    【解决方案2】:

    您需要创建一个名为 FunctionByFour (CREATE OR REPLACE PACKAGE) 的包

    SQL> ed
    Wrote file afiedt.buf
    
      1  CREATE OR REPLACE PACKAGE functionbyfour AS
      2   FUNCTION functone( first number, second number) RETURN NUMBER ;
      3   FUNCTION functtwo( first number, second number, third number) RETURN NUMBER ;
      4   FUNCTION functthree(first number, second number, third number, fourth number) RETURN     NUMBER ;
      5   FUNCTION functfour( first number, second number, third number, fourth number,fifth   number) RETURN NUMBER ;
      6* END  functionbyfour;
      7  /
    
    Package created.
    

    然后是相应的包体 (CREATE OR REPLACE PACKAGE BODY)。您还需要一个 END 作为包体(现在,您的代码在第四个函数的末尾结束)

    SQL> ed
    Wrote file afiedt.buf
    
      1  CREATE OR REPLACE PACKAGE BODY functionbyfour AS
      2    FUNCTION functone (first number, second number ) RETURN number AS total number;
      3    BEGIN
      4      total:=first + second - 1;
      5      RETURN total;
      6      DBMS_OUTPUT.PUT_LINE(total);
      7    END functone;
      8    FUNCTION functtwo (first number, second number, third number ) RETURN number AS  total     number;
      9    BEGIN
     10      total:=first + second + third - 1;
     11      RETURN total;
     12      DBMS_OUTPUT.PUT_LINE(total);
     13    END functtwo;
     14    FUNCTION functthree (first number, second number,third number, fourth number )     RETURN     number AS total number;
     15    BEGIN
     16      total:=first + second + third + fourth - 1;
     17      RETURN total;
     18      DBMS_OUTPUT.PUT_LINE(total);
     19    END functthree;
     20    FUNCTION functfour (first number, second number, third number, fourth number, fifth     number ) RETURN number AS total number;
     21    BEGIN
     22      total:=first + second + third + fourth + fifth - 1;
     23      RETURN total;
     24      DBMS_OUTPUT.PUT_LINE(total);
     25    END functfour;
     26* END functionbyfour;
    SQL> /
    
    Package body created.
    

    完成后,您就可以使用该功能了

    SQL> SELECT functionbyfour.functone(1,2) FROM DUAL;
    
    FUNCTIONBYFOUR.FUNCTONE(1,2)
    ----------------------------
                               2
    

    如果您想将SELECT 语句放在PL/SQL 块中,您需要声明一个局部变量并执行SELECT INTO 以使用函数的结果填充局部变量(您也可以只需将函数调用的结果分配给局部变量,无需使用SELECT)。

    SQL> ed
    Wrote file afiedt.buf
    
      1  DECLARE
      2    l_result NUMBER;
      3  BEGIN
      4    -- First approach
      5    l_result := functionByFour.functOne(1,2);
      6    dbms_output.put_line( l_result );
      7    -- Second approach
      8    SELECT functionByFour.functOne(1,2)
      9      INTO l_result
     10      FROM dual;
     11    dbms_output.put_line( l_result );
     12* END;
     13  /
    2
    2
    
    PL/SQL procedure successfully completed.
    

    另外,请注意,在您的 RETURN 语句之后放置 DBMS_OUTPUT.PUT_LINE 是没有意义的。永远无法达到该代码。如果要将结果打印到DBMS_OUTPUT 缓冲区,则需要在RETURN 之前。

    【讨论】:

      【解决方案3】:

      您对独立程序和软件包感到困惑。

      CREATE FUNCTION 只能用于创建独立的函数。你所拥有的应该是:

      CREATE OR REPLACE PACKAGE functionbyfour AS
      

      一个包由两部分组成,一个规范和一个主体。规范是 API 的公开面,主体是实现。您作为包(规格)所拥有的是包体。所以改变第二段代码开始

      CREATE OR REPLACE PACKAGE BODY functionbyfour AS
      

      至少你的程序结构正确。

      Oracle PL/SQL 文档在线、全面且免费。我敦促你阅读它。 Find out more.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        相关资源
        最近更新 更多