如何找出PLSQL编译错误

时间:2016-11-04 11:11:56

标签: oracle plsql

create or replace procedure address_insert 
as

CREATE type colorarray is varray(10) of varchar2(10);
CREATE type cities is varray(6) of varchar2(20);
CREATE type states is varray(6) of varchar2(15);
CREATE type zipcodes is varray(6) of number(10);
CREATE type countries is varray(6) of varchar2(15);

city cities;
Colour colorarray;
zip zipcodes;
state states;
country countries;
id1 number;
x number;
ca number;
r number;

begin
x:=1;
ca:=1;
id1:=1;
r:=1;
city:=cities('Visakhapatnam','Hyderabad','Bangalore','Chennai','Kurnool','secunderabad');
colour :=colorarray('Red', 'Blue', 'green', 'Dark blue', 'yellow', 'orange', 'brown', 'black', 'white', 'purple');
state:=states('Telangana','Tamilnadu','Karnataka','Andhra Pradesh','Madya Pradesh','Kerala');
zip:=zipcodes(530081,500072,316190,981272,717999,621896);
country:=countries('India','Nepal','Pakistan','USA','Bangladesh','UK');

while x<(select count(persons_id) from person_data) loop

if ca>10 then
ca:=1;
end if;
if r>6 then
r:=1;
end if;

insert into persons_addresses(Address_id,Persons_id,flatname,flatno,house_color,contact_person,address_line1,address_line2,address_line3,
city,district,state,zipcode,country) values
(id1,(select persons_id from (select persons_id,row_number()over (order by persons_id) as rn from person_data)tmp where rn=x),
(SELECT dbms_random.string('L', 15) from dual),(SELECT round(dbms_random.value(100,1000)) num FROM dual),colour(ca),
(SELECT dbms_random.string('L', 5)|| ' ' ||dbms_random.string('L', 7) from dual),
(SELECT dbms_random.string('L', 9)|| ' ' ||dbms_random.string('L', 6)|| ' ' ||dbms_random.string('L', 8)|| ' ' ||dbms_random.string('L', 10) 
FROM dual),(SELECT dbms_random.string('L', 9)|| ' ' ||dbms_random.string('L', 6)|| ' ' ||
dbms_random.string('L', 8)|| ' ' ||dbms_random.string('L', 10) FROM dual),(SELECT dbms_random.string('L', 9)|| ' ' ||
dbms_random.string('L', 6)|| ' ' ||dbms_random.string('L', 8)|| ' ' ||dbms_random.string('L', 10) FROM dual),city(r),(SELECT dbms_random.string('L', 9) from dual),
state(r),zip(r),country(r));
commit;
id1:=id1+1;
ca:=ca+1;
r:=r+1;
x:=x+1;
end loop;
EXCEPTION  -- exception handlers begin
  WHEN OTHERS THEN  -- handles all other errors
          DBMS_OUTPUT.PUT_LINE (SQLCODE|| ' ' || SQLERRM);
end;

有汇编警告。

  

警告:执行完成时出现警告程序address_insert   编译。

执行时:

execute address_insert
  

在命令的第1行开始出错:execute address_insert Error   报告:ORA-06550:第1行第7列:PLS-00905:对象   DATAFOCUS_GROUP.ADDRESS_INSERT无效ORA-06550:第1行第7列:   PL / SQL:语句被忽略   06550. 00000 - &#34;行%s,列%s:\ n%s&#34;   *原因:通常是PL / SQL编译错误。   *操作:

有什么方法可以找出编译错误吗?

SELECT *
  FROM USER_ERRORS
  WHERE NAME = 'ADDRESS_INSERT'

上述查询有助于检索错误。

错误:

  

&#34; PLS-00103:遇到符号&#34; CREATE&#34;当期待其中一个   以下内容:

     

开始函数编译指示程序子类型当前游标删除存在   先前的外部语言符号&#34; CREATE&#34;被忽略了。 &#34;   由于varray定义,遇到了上述错误。   还有其他选择吗?

其他错误:

  

&#34; PLS-00103:遇到符号&#34; SELECT&#34;当期待其中一个   以下内容:

     

( - + case mod new not null继续avg count current   存在最大最小值之前sql stddev sum variance执行forall merge   时间戳间隔日期管道         

,来自&#34;

2 个答案:

答案 0 :(得分:4)

您可以从DBA_ERRORS或USER_ERRORS视图中获取编译错误。在你的情况下,尝试类似

的东西
SELECT *
  FROM USER_ERRORS
  WHERE NAME = 'ADDRESS_INSERT'

请记住,在Oracle表中,视图,过程,包等名称默认为UPPER_CASE,即使它们在源代码中显示在lower_case中也是如此。

从顶部我可以看到CREATE TYPE在程序中无效。你可能想要像

这样的东西
TYPE COLORARRAY IS VARRAY(10) OF VARCHAR2(10)

有关详细信息,请参阅the PL/SQL Reference Manual section on defining collection types.

祝你好运。

答案 1 :(得分:2)

如果您使用的是SQL * Plus,请执行“显示错误”。这也适用于SQL Developer的SQL工作表。

enter image description here

如果你在一个合适的IDE中 - 你会在编译时看到错误。

enter image description here