ORA-06553: PLS-801: internal error [56319],64位oracle降级为32位的处理

本文讨论了在使用SQL*Plus执行数据库迁移时遇到的ORA-06553:PLS-801:internal error[56319]错误,并详细解释了从32位到64位服务器迁移过程中遇到的问题及其解决方案。

做测试环境数据库迁移的时候,遇到一个小问题。
[oracle@public_test admin]$ sqlplus system/internal@UUP70_test

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Oct 31 14:18:13 2012

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

ERROR:
ORA-06553: PLS-801: internal error [56319]


ERROR:
ORA-06553: PLS-801: internal error [56319]


Error accessing package DBMS_APPLICATION_INFO

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
数据库是可以连接的,但报ORA-06553: PLS-801: internal error [56319]的错误。
在进行SQL语句查询的时候,经常会有这个错误出现。

网上查了些资料,有说可能是数据库位数问题,检查源库与目标库:
[oracle@DB-PUBLIC oracle]$ getconf LONG_BIT
32

新的服务器: 64位

果然,是从32位到了64位。迁移过程我是这么做的:从源库用RMAN备份出来,在目标库恢复。然后open resetlogs

现在目标库是64位的。

[oracle@public_test bdump]$ hostname
public_test
[oracle@public_test bdump]$ getconf LONG_BIT
64

[oracle@public_test bdump]$ which oracle
/oracle/product/9.2.0/db_1/bin/oracle

[oracle@public_test bdump]$ file /oracle/product/9.2.0/db_1/bin/oracle           --说明数据库是64位的。
/oracle/product/9.2.0/db_1/bin/oracle: setuid setgid ELF 64-bit LSB executable, AMD x86-64,
version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), not stripped

 


后来我做了如下的步骤,在进行SQL语句查询的时候,就不会有这样的错误出现了。
1、Shutdown immediate
2、startup migrate
注:startup migrate表示降级,在9i,无论升级/降级 数据库都是startup migrate;
10g后增加了upgrade参数,升级可直接用startup upgrade,降级仍是startup migrate.
3、@$ORACLE_HOME/rdbms/admin/utlirp.sql;     --从32位到64位或者从64位到32位,需要编译包
4、Shutdown immediate
5、Startup
6、@$ORACLE_HOME/rdbms/admin/utlrp.sql;     --编译无效对象
7、Shutdown immediate
8、Startup


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10173379/viewspace-748014/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10173379/viewspace-748014/

<think>嗯,用户现在遇到了ORA-06553: PLS-306错误,想解决在Oracle中使用TRANSFORM函数将SHAPE字段的空间几何数据转换为4326坐标系的经纬度的问题。让我仔细看看用户的需求和之前的对话。 首先,用户之前的提问是关于将SHAPE字段转换为经纬度,其中用到了SDO_CS.TRANSFORM函数。我的回答里提到了使用这个函数进行坐标转换,并提取X和Y作为经纬度。现在用户遇到了参数类型或数量错误的问题,可能是在调用这个函数时出现了问题。 根据用户提供的引用内容,尤其是引用[2]和[3],ORA-06553错误通常是因为调用存储过程或函数时参数的数量或类型不匹配。比如,存储过程定义了一个OUT参数,但调用时没有提供,或者参数类型不符。这可能同样适用于SDO_CS.TRANSFORM函数的调用。 现在,我需要检查用户可能在使用SDO_CS.TRANSFORM时的参数是否正确。根据Oracle文档,SDO_CS.TRANSFORM的语法通常是这样的:SDO_CS.TRANSFORM(geometry, target_srid)。如果原数据没有定义正确的SRID,或者函数需要更多的参数,比如源SRID,可能会引发错误。 用户之前写的SQL是: SDO_CS.TRANSFORM(SHAPE, 4326).SDO_POINT.X AS lon 这里可能存在两个问题:首先,SHAPE字段的几何对象的SRID是否已经正确设置?如果原数据的坐标系不是默认的,可能需要显式指定源SRID。其次,转换后的几何对象是否是点类型?如果不是点类型,直接访问SDO_POINT可能会出错,应该考虑使用SDO_GEOMETRY的其他方法,比如获取质心。 另外,引用[4]中提到调用存储过程时参数不匹配的例子,可能用户在使用TRANSFORM函数时参数传递不正确,比如没有正确指定坐标系参数的数量,或者类型不对。比如,如果原几何的SRID未定义,直接转换到4326可能会失败,需要显式指定源SRID。 可能的解决方案包括: 1. 检查SHAPE字段的SRID是否正确,确保原数据有正确的坐标系定义。 2. 如果原SRID未设置,需要在TRANSFORM函数中明确指定源坐标系和目标坐标系。 3. 确保转换后的几何对象是点类型,否则需要使用SDO_GEOM.SDO_CENTROID等函数获取点的坐标。 4. 验证用户是否有权限使用SDO_CS包,以及Oracle Spatial组件是否安装正确。 另外,用户可能需要处理非点几何,比如线或多边形,这时候需要提取中心点或特定点,否则访问SDO_POINT会出错。例如,使用SDO_GEOM.SDO_CENTROID来获取几何体的中心点,然后再提取坐标。 还需要考虑数据库的版本和Spatial组件的兼容性,不同版本的Oracle可能在函数参数上有差异,导致参数数量或类型不匹配的错误。 总结下来,用户的问题可能出在:1. SHAPE字段的SRID未定义或错误,导致转换失败;2. 转换后的几何类型不是点,无法直接提取X和Y;3. TRANSFORM函数的参数使用不正确,需要显式指定源和目标SRID;4. 权限或组件缺失导致函数无法正确调用。</think>--- ### **ORA-06553: PLS-306错误分析与解决方案** #### **问题根源** 当调用`SDO_CS.TRANSFORM`函数时,若出现**ORA-06553: PLS-306**错误,通常由以下原因导致: 1. **参数类型或数量不匹配**:函数期望的参数类型或数量与实际调用不一致。 2. **坐标系定义缺失**:原始几何对象未定义坐标系(SRID),或目标坐标系未注册。 3. **几何类型非点**:直接提取`SDO_POINT.X/Y`时,若几何类型为线或多边形,会因字段不存在而错[^1]。 --- ### **解决方案分步说明** #### **步骤1:验证几何坐标系定义** 确认`SHAPE`字段的几何对象已正确设置源坐标系(如EPSG:3857): ```sql -- 查看几何字段的SRID SELECT SDO_SRID(SHAPE) FROM WGI_DEVICE_BOOSTERS WHERE ROWNUM = 1; ``` - 若结果为`NULL`或非目标坐标系(如3857),需显式指定转换参数: ```sql SDO_CS.TRANSFORM(SHAPE, 4326, 3857) -- 从EPSG:3857转到4326 ``` #### **步骤2:调整TRANSFORM函数调用** 若原始SRID未定义,强制指定源坐标系: ```sql SELECT OBJECTID, ADDR, SDO_CS.TRANSFORM( SHAPE, 4326, -- 目标坐标系 3857 -- 显式指定源坐标系(假设原始为Web墨卡托) ).SDO_POINT.X AS lon, SDO_CS.TRANSFORM( SHAPE, 4326, 3857 ).SDO_POINT.Y AS lat FROM WGI_DEVICE_BOOSTERS WHERE COMPANY_ENCOD = 'CR0072002645' AND REGEXP_LIKE(ADDR, '柜$'); ``` #### **步骤3:处理非点几何类型** 若`SHAPE`存储线或多边形,需提取中心点或首端点: ```sql -- 示例:提取几何中心点 SELECT SDO_GEOM.SDO_CENTROID( SDO_CS.TRANSFORM(SHAPE, 4326), 0.005 -- 容差值 ).SDO_POINT.X AS lon FROM WGI_DEVICE_BOOSTERS; ``` #### **步骤4:检查函数权限与组件** 确保用户有权访问`SDO_CS`和`SDO_GEOM`包: ```sql -- 检查权限 SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME IN ('SDO_CS', 'SDO_GEOM'); ``` - 若无权限,联系DBA授权: ```sql GRANT EXECUTE ON MDSYS.SDO_CS TO <用户名>; ``` --- ### **错误场景对照表** | 错误现象 | 原因 | 修复方法 | |---------------------------|-------------------------------|---------------------------------------| | `PLS-306` + 参数类型错误 | 未显式指定源坐标系 | 添加`SDO_CS.TRANSFORM(shape, 4326, 源SRID)` | | `SDO_POINT.X`为空 | 几何类型非点 | 使用`SDO_GEOM.SDO_CENTROID`提取中心点 | | `ORA-06553` + 函数不存在 | 未安装Oracle Spatial组件 | 安装Spatial组件或联系DBA | --- ### **引用说明** [^1]: 若几何类型非点,直接访问`SDO_POINT`会因字段不存在而错,需改用质心提取。 [^2]: 显式指定源坐标系可避免因SRID未定义导致的转换失败。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值