Oracle创建引用Class表的PKG_Class包时出现编译错误是什么原因
包创建编译错误的原因
你的代码存在3类问题直接导致编译失败:
- 标识符大小写匹配错误
你建表时使用双引号包裹了表名和所有字段名,Oracle会保留名称的原有大小写,不会自动转为大写存储。而你在包代码中引用Class.Class_id、Class.Tybe这类标识符时,未加双引号的部分会被Oracle默认转为全大写匹配,也就是尝试查找CLASS表和CLASS_ID这类全大写字段,和你实际创建的大小写混合的表、字段完全无法匹配,触发标识符不存在的错误。 - 关键字冲突错误
你表中的Max字段名是Oracle内置的聚合函数关键字,未加双引号引用时,Oracle会将Class.Max识别为调用聚合函数,而非表字段,直接触发语法错误。 - 函数定义语法错误
Find函数的参数列表末尾多了一个多余的右括号和分号,属于基础语法格式错误,直接阻断编译。
修复方案
- 优先建议删除原带双引号创建的
"Class"表,重新建表时不使用双引号,同时避免用关键字作为字段名,示例建表语句:
create table Class ( Class_id number(10) primary key, Tybe number(5), Class_name varchar2(10), Max_num number(20) );
- 同步修改包代码中的字段引用,把原来的
Max替换为新的字段名Max_num,同时删除Find函数多余的符号,修正后的函数代码如下:
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_num%Type ) RETURN BOOLEAN;
如果不想修改表结构,也可以在包代码中所有引用表名和字段名的位置都加双引号保留原有大小写,比如写为"Class"."Class_id"%Type、"Class"."Max"%Type即可。
内容的提问来源于stack exchange,提问作者shereen saleh
相关产品推荐
相关产品推荐

