【问题标题】:Erorr in create Package Body创建包体时出错
【发布时间】:2022-01-11 03:15:20
【问题描述】:

我创建了名为 Class 的表,然后也创建了名为 PKG_Class 的包 没关系。 但是(Backage Body)的执行给了我错误“Package Body Created with Compilation Erorr”

创建表类 ( Class_id number(10) 主键, 类型号(5), 类名 varchar2(10), 最大数量(20) );

CREATE OR REPLACE PACKAGE PKG_Class IS

    PROCEDURE ClassAdd(
            ID_C in Class.Class_id%Type ,
            C_Type in Class.Tybe%Type ,
            C_Name in Class.Class_name%Type ,
            C_Max in Class.Max%Type );
 
    PROCEDURE ClassUpdate( 
        ID_C in Class.Class_id%Type ,
            C_Type in Class.Tybe%Type ,
            C_Name in Class.Class_name%Type ,
            C_Max in Class.Max%Type );

    PROCEDURE ClassDelete( 
       ID_C in Class.Class_id%Type );
    
    PROCEDURE ClassFind( 
        ID_C in Class.Class_id%Type ,
            C_Type out Class.Tybe%Type ,
            C_Name out Class.Class_name%Type ,
            C_Max out Class.Max%Type );

           
    FUNCTION FindClass(
       ID_C in Class.Class_id%Type
    ) RETURN Class%ROWTYPE ;
    
    FUNCTION Find(
        ID_C in Class.Class_id%Type ,
            C_Type out Class.Tybe%Type ,
            C_Name out Class.Class_name%Type ,
            C_Max out Class.Max%Type 
    ) RETURN BOOLEAN;

END PKG_Class;

////////////////////////////

 CREATE OR REPLACE PACKAGE Body PKG_Class IS
    PROCEDURE ClassAdd(
                ID_C in Class.Class_id%Type ,
                C_Type in Class.Tybe%Type ,
                C_Name in Class.Class_name%Type ,
                C_Max in Class.Max%Type )     
         IS
         BEGIN
         insert into Class
         values(ID_C, C_Type, C_Name, C_Max );
      Commit;
      END ClassAdd;
    
        PROCEDURE ClassUpdate( 
            ID_C in Class.Class_id%Type ,
                C_Type in Class.Tybe%Type ,
                C_Name in Class.Class_name%Type ,
                C_Max in Class.Max%Type )  
    
         IS
         BEGIN
         Update Class set C_Type = Tybe ,
                     C_Name = Class_name ,
                     Width_Pool = Width_P ,
                    C_Max = Max
                WHERE ID_C = Class_id ;
     Commit;
     END ClassUpdate;
    
        PROCEDURE ClassDelete( 
           ID_C in Class.Class_id%Type )
        IS
        BEGIN
        DELETE FROM Class WHERE 
        ID_C = Class_id;
      
    Commit;
    END ClassDelete;
    
        PROCEDURE ClassFind( 
            ID_C in Class.Class_id%Type ,
                C_Type out Class.Tybe%Type ,
                C_Name out Class.Class_name%Type ,
                C_Max out Class.Max%Type )  
    
     IS
     BEGIN
             SELECT Tybe, Class_name, Max
             INTO C_Type, C_Name, C_Max
             FROM Class
             WHERE Class_id = ID_C;
     END ClassFind;
    
        FUNCTION Find(
            ID_C in Class.Class_id%Type ,
                C_Type out Class.Tybe%Type ,
                C_Name out Class.Class_name%Type ,
                C_Max out Class.Max%Type 
        ) RETURN BOOLEAN
    
     IS
     BEGIN
     SELECT Tybe, Class_name, Max
     INTO C_Type, C_Name, C_Max
     FROM Class
     WHERE Class_id = ID_C;
     RETURN TRUE;
     Exception
     WHEN NO_DATA_FOUND THEN
     RETURN False;
     END Find;
    
        FUNCTION FindClass(
           ID_C in Class.Class_id%Type
        )  RETURN Class%ROWTYPE 
    IS
    RECORD_C Class%ROWTYPE;
    BEGIN
    SELECT * 
    Into RECORD_C
    From Class
    Where ID_C=Class_id;
    RETURN RECORD_C;
    END FindClass;
    
    END PKG_Class;

【问题讨论】:

  • 首先,不要从不同的账户向the same question问两次。其次,请阅读该问题的答案和 cmets,您被指示执行show errors 命令或查询user_errors 表以了解实际错误。第三,至少尝试调试您的代码并找到出现错误的地方。不要只发布带有“为我调试”问题的代码清单
  • 我是 oracle DB 的初学者,你能帮我在哪里执行“显示错误”吗?
  • 我是 oracle DB 的初学者,你能帮我在哪里执行“显示错误”吗?我使用 iSQL*PLUS。

标签: oracle plsql oracle11g


【解决方案1】:

在过程ClassUpdate 的主体中,更新表Class 的列中的值。在 update 语句中,将列 C_Max 更新为值 Max。那是错误的方式。表中列的名称为Max,您希望将其更新为作为参数传递的值C_Max。分配是单向的:右侧分配给左侧。你不能扭转“平等”,因为它不是真正的平等,它只使用相同的符号。

如果我正确阅读了您的其余代码,那么您在其他列中也犯了类似的错误。

顺便说一句,max 是聚合函数的名称。虽然它不是保留(这意味着您可以将其用作列名),但您仍然不应该将其用作列名;您将为自己和可能需要维护您的代码的其他人制造混乱。即使这只是为了学校(意思是,没有人会维护这个代码),最好养成良好的习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2016-06-14
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多