1. 程式人生 > >儲存過程裡的序列報錯Error: PLS-00302: component 'SEQUENCE_NAME' must be declared

儲存過程裡的序列報錯Error: PLS-00302: component 'SEQUENCE_NAME' must be declared

      今天遇到一個奇怪的問題,儲存過程的呼叫序列編譯是報錯 Error: PLS-00302: component 'SEQUENCE_NAME' must be declared

序列是存在,拿出來可以執行成功,序列加字首了,最後找到原因了是因為使用者下有一個表和使用者名稱同名導致的,這是oracle一個bug 已經修復了影響的版本為PL/SQL - Version: 10.2.0.4 to 11.2.0.3 - Release: 10.2 to 11.2

如下圖報錯:


解決方法:

Rename/ drop any conflicting object with the same name as the schema name



SELECT OBJECT_NAME, OBJECT_TYPE
FROM ALL_OBJECTS
WHERE OBJECT_NAME='USERNMAME'

原因:

An object exists with the same name as the schema owner causing a pl/sql compilation error.

Bug:1218383  PLS-327 WHEN COMPILE SCHEMA.SEQUENCE WITH EXISTING TABLE WITH SCHEMA NAME

以下在 11.2.0.1.0 的環境重現這個問題

C:\Users\Administrator>sqlplus u1/u1
SQL*Plus: Release 11.2.0.1.0 Production on 星期四 11月 6 16:31:25 2014
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
連線到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
建立序列seq_u1
SQL> create sequence seq_u1
  2  minvalue 1
  3  maxvalue 9999999
  4  start with 1
  5  increment by 1
  6  cache 5;
序列已建立。
 
建立和使用者名稱同名的表u1
SQL> create table u1 (id number);
表已建立。

建立儲存過程呼叫序列:

SQL> create or replace procedure next_val is
  2  v_next number;
  3  begin
  4    select  u1.seq_u1.Nextval into v_next  from dual;
  5
  6    insert into test values (u1.seq_u1.NEXTVAL);
  7  exception
  8    when others then
  9      null;
 10  end next_val;
 11  /


警告: 建立的過程帶有編譯錯誤。

編譯有錯誤:(問題重現)
SQL> show error
PROCEDURE NEXT_VAL 出現錯誤:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/14     PLS-00302: 必須宣告 'SEQ_U1' 元件
6/31     PLS-00302: 必須宣告 'SEQ_U1' 元件
SQL>

查詢與使用者名稱同名的物件:
SQL> SELECT OBJECT_NAME, OBJECT_TYPE
  2  FROM ALL_OBJECTS
  3  WHERE OBJECT_NAME='U1';

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
U1                             TABLE

刪除同名物件
SQL> drop table u1;

表已刪除。

從新編譯,編譯通過問題解決
SQL> alter procedure next_val compile;

過程已更改。
SQL> show error
沒有錯誤。
SQL>