【问题标题】:How to find out PLSQL Compilation errors如何找出 PLSQL 编译错误
【发布时间】:2017-03-18 04:48:58
【问题描述】:
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 行开始的错误:执行 address_insert 错误 报告:ORA-06550:第 1 行,第 7 列:PLS-00905:对象 DATAFOCUS_GROUP.ADDRESS_INSERT 无效 ORA-06550:第 1 行,第 7 列: PL/SQL:语句被忽略 06550. 00000 - “第 %s 行,第 %s 列:\n%s” *原因:通常是 PL/SQL 编译错误。 *行动:

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

SELECT *
  FROM USER_ERRORS
  WHERE NAME = 'ADDRESS_INSERT'

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

错误:

“PLS-00103:在期待其中之一时遇到符号“CREATE” 以下:

begin function pragma procedure subtype type current cursor delete exists 先前的外部语言符号“CREATE”被忽略。 " 由于可变数组定义而遇到上述错误。 有没有其他选择?

其他错误:

“PLS-00103:在期待其中一个时遇到符号“SELECT” 以下:

( - + case mod new not null continue avg count current 存在 max min prior sql stddev sum variance 执行 forall 合并 时间 时间戳 间隔 日期 管道

,来自“

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您可以从 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.

    祝你好运。

    【讨论】:

    • 是的,你完全正确。我现在明白了。谢谢鲍勃!
    【解决方案2】:

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

    如果您使用的是正确的 IDE - 您会在编译时看到错误。

    【讨论】:

    • “显示错误”如何工作?是否会打印(例如程序)名称及其错误。我们是单独执行它吗?还是我们将它与 plsql blck 关联起来?。
    • @EmilySharon show errors 在 SQL Developer 中的工作方式与在 SQL*PLUS 中的工作方式相同。只需在您的create procedure|function|type|package|etc 语句之后键入它,如图#1 所示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多