分類  >  資料庫 >

OGC_X的ORA-06553異常

tags:    時間:2014-05-04 12:35:17
OGC_X的ORA-06553錯誤

ORA-06553: PLS-306: 調用 『OGC_X』 時參數個數或類型錯誤

對於這個錯誤開始我也覺得挺納悶,在他的Form中根本沒有調用什麼OGC_X的方法,只能一步一步分析看看到底發生什麼事情了。

 

 

首先想到利用Help –> 的功能來查看真正執行的SQL語句是什麼呢?  

?View Code SQL
 
1 2 3 4 5 6 
  SELECT REF(x),        ......        x.last_updated_by,        x.last_update_date,        x.last_update_login   FROM xhu_po_quote_headers_2213_v x

可是這句SQL看上去和OGC_X沒有什麼關係啊?難不成和x有關係,看似沒什麼道理可言?

那就利用數據字典來看看吧,到底OGC_X是何物,總是和這個SQL語句過意不去呢?

?View Code SQL
 
1 2 3 4 5 6 7 8 
  SQL> SELECT owner, object_name, object_type     2    FROM dba_objects     3   WHERE object_name = 'OGC_X';     OWNER     OBJECT_NAME    OBJECT_TYPE   --------- -------------- --------------   PUBLIC    OGC_X          SYNONYM   MDSYS     OGC_X          FUNCTION

系統中果然存在OGC_X名稱的FUNCTION,這樣從上面的ORA-06553錯誤來看,果然這個SQL語句執行了這個FUNCTION,但是它為什麼會被執行呢?再來看看OGC_X的定義 。

?View Code SQL
 
1 2 3 4 5 
  SQL> desc OGC_X;   Parameter Type           Mode Default?    --------- -------------- ---- --------    (RESULT)  NUMBER                          P         MDSYS.ST_POINT IN

再看看這個SQL語句, 難不成真的和x有關係?我就試一把將x改為其它的別名,就叫poh,執行修改後的SQL,果然沒有錯誤,原來真的和別名x有關係,

那即使是別名x搞的鬼,那OGC_X和x會有關係嗎,它們怎麼就聯繫在一起了?想了一下,同義詞可以將它們連在一起,說不定是這個原因。

?View Code SQL
 
1 2 3 4 5 6 7 8 
  SQL> SELECT owner, synonym_name, table_owner, table_name     2    FROM dba_synonyms     3   WHERE table_name = 'OGC_X';     OWNER      SYNONYM_NAME    TABLE_OWNER   TABLE_NAME   ---------- --------------- ------------- -------------   PUBLIC     OGC_X           MDSYS         OGC_X   PUBLIC     X               MDSYS         OGC_X

一看同義詞的查詢結果,答案果然找出來了,原來OGC_X創建了一個同義詞名稱為x,所以上面SQL中REF(x)中就被認為調用了OGC_X這個FUNCTION,而又沒有提供給它調用的參數,所以報出調用的參數個數或類型錯誤。

這個問題的關鍵部分已經解決,可是進一步想,既然x有同義詞,會不會也有名為y的同義詞呢,來看看?

?View Code SQL
 
1 2 3 4 5 6 7 
  SQL> SELECT owner, synonym_name, table_owner, table_name     2   FROM dba_synonyms     3  WHERE synonym_name = 'Y' ;     OWNER     SYNONYM_NAME    TABLE_OWNER    TABLE_NAME   --------- --------------- -------------- ------------   PUBLIC    Y               MDSYS          OGC_Y

系統中真有這樣的同義詞,Oracle為什麼要這樣呢,google一把吧,找到了Oracle官方的說法:

Oracle Spatial is conformant with Open Geospatial Consortium (OGC) Simple Features Specification 1.1.1 (Document 99-049), starting with Oracle Database release 10g(version 10.1.0.4). Conformance with the SQL92 with Geometry Types Implementation means that Oracle Spatial supports all the types, functions, and language constructs detailed in Section 3.2 of the specification. Synonyms are created to match all OGC function names except for X(p Point) and Y(p Point). For these functions, you must use the names OGC_X and OGC_Y instead of just X and Y.

上面的疑問都已經有了答案,可是Form生成的SQL語句怎麼又多了一個別名X呢?答案就在Form數據塊的設置上面,資料庫的別名被設置為x了,要徹底解決這個只要去掉別名或者命名為其它不衝突的別名即可。

 

 

從這個問題可以看到,一些看似互不相關的問題實質是有其內在的聯繫,在程序的開發中沒有妖怪的存在;同時一個好的命名會減少很多不必要的錯誤發生。

 

 

 

 

 

文章轉自:http://oracleseeker.com/2009/08/15/raise_ora-06553_ogc_x_error_in_oracle_form/

 

 

 

 

推薦閱讀文章

Bookmark the permalink ,來源:互聯網