警告:已编译但在 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 中存在编译错误的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 终止会话过程

java程序用Eclipse打包的时候出现资源与文件系统不一致怎么解决?

让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数

我收到警告:创建的过程存在编译错误

TRIGGER AUTO_NUM_GEN 已编译警告:执行完成但有警告

oracle存储过程提示编译完成但存在错误,如何查看错误