OGC_X的ORA-06553错误

OGC_X

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了,要彻底解决这个只要去掉别名或者命名为其它不冲突的别名即可。

block_alias_x

 

 

从这个问题可以看到,一些看似互不相关的问题实质是有其内在的联系,在程序的开发中没有妖怪的存在;同时一个好的命名会减少很多不必要的错误发生。

 

 

 

 

 

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

 

 

 

 

你可能感兴趣的:(ora)