警告:已编译但在 oracle 中存在编译错误
Posted
技术标签:
【中文标题】警告:已编译但在 oracle 中存在编译错误【英文标题】:Warning: compiled but with compilation error in oracle 【发布时间】:2017-04-21 13:13:52 【问题描述】:我在蟾蜍中收到了这个警告。所以无法使用该程序。我先创建一个可变数组。
CREATE or replace TYPE notif_array AS VARRAY(100000) OF VARCHAR2(10);
然后我正在创建一个过程。
CREATE OR REPLACE PROCEDURE get_notification_id
( personrole in varchar2, personid out notif_array )
is
begin
DBMS_OUTPUT.PUT_LINE(personrole);
select person_id into personid
from exp_role_person_mapping
where person_role = personrole;
exception
when others then
personid := null;
end;
然后我收到蟾蜍的警告
Warning: compiled but with compilation errors
【问题讨论】:
查询user errors
视图以查看实际问题。 (不确定 Toad 是否支持 show errors
。)
@AlexPoole。试过了。它显示“没有错误”。
将光标移到程序上并按F4,弹出窗口将打开并转到错误选项卡。
它是pl/sql ora-00932 inconsistent datatypes expected udt got char
。如果您将select person_id into ...
更改为select person_id bulk collect into...
,则程序编译。
完成。它说“PL/SQL:ORA-00932:不一致的数据类型:预期的 UDT 得到了 CHAR”
【参考方案1】:
您需要更改将数据分配给 personid 的方式。
它不是基本数据类型,而是根据您的要求定义的自定义数据类型
CREATE OR REPLACE PROCEDURE get_notification_id(personrole in varchar2,personid out notif_array)
is
CURSOR cur_temp(per_role varchar2)
IS
select person_id from exp_role_person_mapping where person_role=per_role;
index NUMBER := 1;
begin
DBMS_OUTPUT.PUT_LINE(personrole);
FOR datarecord in cur_temp(personrole)
LOOP
personid(index) := datarecord.person_id;
index = index + 1;
END LOOP;
exception when others then
personid:=null;
end;
【讨论】:
【参考方案2】:只需在选择语句中添加“批量收集”。感谢 Ponder Stibbons
CREATE OR REPLACE PROCEDURE get_notification_id(personrole in varchar2,personid out notif_array)
is
begin
select person_id bulk collect into personid from exp_role_person_mapping where person_role=personrole;
exception when others then
personid:=null;
end;
【讨论】:
以上是关于警告:已编译但在 oracle 中存在编译错误的主要内容,如果未能解决你的问题,请参考以下文章
java程序用Eclipse打包的时候出现资源与文件系统不一致怎么解决?
让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数