Oracle创建PKG_Class包体提示编译错误问题咨询
包体编译错误原因排查
- 错误1:
ClassUpdate存储过程UPDATE语句赋值逻辑颠倒UPDATE语法规则为
UPDATE 表名 SET 表字段名 = 新值 WHERE 条件,原代码写反了赋值方向,把表原有字段值赋值给了输入参数,完全不符合更新需求。 - 错误2:
ClassUpdate存储过程存在多余无效代码
Class表中不存在Width_Pool字段,代码中也没有定义Width_P参数,该行属于完全多余的错误代码,需要删除。 - 可选优化项:避免与内置函数重名冲突
Max是Oracle内置聚合函数,使用该字段时建议给表添加别名,避免Oracle解析时误判为函数调用引发错误。
快速定位编译错误方法
遇到包编译错误时可以直接执行以下语句,就能看到具体的错误行号和错误描述:
SELECT * FROM USER_ERRORS WHERE NAME = 'PKG_CLASS' AND TYPE = 'PACKAGE BODY';
修正后的包体完整代码
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 Tybe = C_Type, Class_name = C_Name, Max = C_Max WHERE Class_id = ID_C; Commit; END ClassUpdate; PROCEDURE ClassDelete( ID_C in Class.Class_id%Type ) IS BEGIN DELETE FROM Class WHERE Class_id = ID_C; 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 Class_id = ID_C; RETURN RECORD_C; END FindClass; END PKG_Class; /
内容的提问来源于stack exchange,提问作者Roka
相关产品推荐
相关产品推荐

