1. 程式人生 > >Form中OGC_X的ORA-06553錯誤

Form中OGC_X的ORA-06553錯誤

 

昨天一位同學問為什麼自己開發的Form執行Ctrl+F11時報出如下的錯誤:

OGC_X

ORA-06553: PLS-306: 呼叫 ‘OGC_X’ 時引數個數或型別錯誤

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

首先想到利用Help –> 的功能來檢視真正執行的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語句過意不去呢?

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的定義 。

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會有關係嗎,它們怎麼就聯絡在一起了?想了一下,同義詞可以將它們連在一起,說不定是這個原因。

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的同義詞呢,來看看?

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了,要徹底解決這個只要去掉別名或者命名為其它不衝突的別名即可。

block_alias_x

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