Microsoft OLE DB Provider for Oracle error '80004005'

本文记录了解决Oracle 9i与ASP.NET在Win2000 SP4及IIS5.0环境下连接失败的问题过程。通过调整Oracle安装目录的安全权限设置,成功实现了两者的正常连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做项目时发现一个如标题的问题

环境配置:

Win2000 sp4

IIS 5.0

.net framework 1.1

Oracle9i(用OleDb连接)

环境配好后,SQL*PLUS连接没问题.

随便做了个ASP.NET工程,想测试一下和数据库的连接,结果发生错误.记得以前用8i的时候没有错的啊.

没有办法,只好上网去查,终于找到一个和我遇到同样问题的.以下是他的网址

http://www.vbip.com/forum/topic.asp?id=6259

以下是引用:

--------------------------------------------------------------------------------------------------

Go to your ORACLE_HOME folder, D:/Oracle/Ora92 in my case, and pull up its properties. Then head to the security tab and select the Authenticated Users group. The three permissions that should be checked are Read & Execute, List Folder Contents, and Read. Uncheck Read & Execute then RE-Check it again to reset permissions for everything underneath. Just to be safe, go into the ADVANCED settings and make sure that Authenticated Users has "This folder, subfolders and files" under the APPLY TO column. If not, double click on it and change the drop down to say that. It should say this already by now, but just be sure it does!

Reboot and everything should work as advertised ... it finally worked for me.
----------------------------------------------------------------------------------------------------

我按着改了以后,问题解决了.

分析:

感觉是Oracle和.net的权限问题,但是我把ASPNET的权限该为administrator了还不行.

按他说的,好象Oracle里有文件没有被附上读和执行的权限.但具体是哪些文件,不清楚.

有遇到类似问题的朋友可以试着改一下,看看问题能不能解决.

 

 

 

 

<think>我们正在处理一个Oracle数据库错误:ORA-06550和PLS-00306,该错误发生在调用存储过程P_ABSENCE_DELETE_TW时。错误表明参数的数量或类型与存储过程定义不匹配。###问题分析-**错误代码**:PLS-00306(调用存储过程时参数数量或类型错误)-**环境**:通过OLEDB提供程序(OraOLEDB.Oracle)链接服务器调用Oracle存储过程###解决步骤####1.确认存储过程的参数定义查询存储过程`P_ABSENCE_DELETE_TW`在Oracle中的定义:```sqlSELECTobject_name,argument_name,data_type,in_outFROMall_argumentsWHEREobject_name='P_ABSENCE_DELETE_TW'ORDERBYsequence;```####2.检查调用语句在调用该存储过程的代码中,检查:-传入参数的数量是否与定义一致-每个参数的数据类型是否匹配-参数传递的顺序是否正确####3.处理链接服务器调用通过链接服务器调用Oracle存储过程时,使用以下语法:```sqlEXEC('BEGINschema_name.P_ABSENCE_DELETE_TW(:1,:2,...);END;')AT[linked_server_name];```-`schema_name`:存储过程所属的Oracle模式-`linked_server_name`:已配置的链接服务器名称-使用位置参数(`:1`,`:2`)时需确保顺序和数量正确####4.参数传递示例假设存储过程定义为:```sqlPROCEDUREP_ABSENCE_DELETE_TW(p_empnoINVARCHAR2,p_dateINDATE,p_resultOUTVARCHAR2);```则正确的调用方式为:```sqlDECLARE@resultVARCHAR(100);EXEC('DECLAREresultVARCHAR2(100);BEGINHR.P_ABSENCE_DELETE_TW(''E001'',TO_DATE(''2023-01-01'',''YYYY-MM-DD''),result);?:=result;END;',@resultOUTPUT)ATSAL_HCPPROD;```####5.常见错误及修复|错误类型|解决措施||---------|---------||参数数量不符|检查定义与实际传递的数量差异||类型不匹配|在Oracle端使用`TO_DATE`、`CAST`等转换函数||参数顺序错误|调整参数顺序与定义一致||字符集问题|添加N前缀(如`N'中文字符'`)传递Unicode字符串|####6.调试建议-在Oracle端单独测试存储过程调用-使用简单参数值验证基本功能-捕获详细错误信息:```sqlBEGINTRYEXEC(...)ATSAL_HCPPROD;ENDTRYBEGINCATCHSELECTERROR_MESSAGE();ENDCATCH```###关键注意事项1.**日期格式处理**:Oracle的日期字面量需显式转换,例如`TO_DATE('20230203','YYYYMMDD')`2.**字符串引号**:在EXEC字符串内需使用两个单引号表示一个单引号3.**Unicode支持**:中文字符串前加`N`前缀(如`N'王大明'`)4.**OUT参数处理**:使用绑定变量捕获输出值###高级解决方案若问题仍存在,可创建Oracle端包装函数:```sqlCREATEFUNCTIONF_ABSENCE_DELETE_TW(...)RETURN...ASBEGINP_ABSENCE_DELETE_TW(...);--调用原存储过程RETURN...;END;```然后通过链接服务器调用该函数,函数调用在跨数据库交互中通常有更好的兼容性。§§相关问题§§1.如何配置Oracle链接服务器以支持存储过程调用?2.Oracle存储过程的INOUT参数在跨服务器调用时如何处理?3.ORA-06550错误的其他常见原因有哪些?4.如何捕获链接服务器调用的详细错误堆栈?</think> ### 解决Oracle存储过程调用参数错误(ORA-06550 / PLS-00306) #### 错误分析 ```mermaid graph LR A[调用P_ABSENCE_DELETE_TW] --> B{参数检查} B -->|数量匹配| C{类型检查} B -->|数量不匹配| D[PLS-00306] C -->|类型匹配| E[执行成功] C -->|类型不匹配| D[PLS-00306] D --> F[ORA-06550] ``` 该错误表示调用存储过程`P_ABSENCE_DELETE_TW`时存在以下问题: 1. **参数数量不匹配**:传递的参数数量 ≠ 存储过程定义的参数数量 2. **参数类型不匹配**:参数的数据类型(如VARCHAR2 vs DATE)与定义不一致 3. **参数顺序错误**:参数传递顺序与定义顺序不一致[^1] --- ### 逐步解决方案 #### 步骤1:确认存储过程定义 查询Oracle数据字典获取参数定义: ```sql SELECT argument_name, data_type, in_out FROM all_arguments WHERE object_name = 'P_ABSENCE_DELETE_TW' ORDER BY sequence; ``` 典型输出: ``` ARGUMENT_NAME DATA_TYPE IN_OUT ------------- --------- ------ P_EMP_ID VARCHAR2 IN P_START_DATE DATE IN P_END_DATE DATE IN P_RESULT_CODE NUMBER OUT ``` #### 步骤2:检查调用代码 排查您的调用代码是否满足: ```sql -- 错误示例(参数数量不足) BEGIN P_ABSENCE_DELETE_TW('E10001', SYSDATE); -- 缺少P_END_DATE参数 END; -- 正确调用 DECLARE v_result NUMBER; BEGIN P_ABSENCE_DELETE_TW( P_EMP_ID => 'E10001', P_START_DATE => TO_DATE('2023-01-01','YYYY-MM-DD'), P_END_DATE => SYSDATE, P_RESULT_CODE => v_result ); END; ``` #### 步骤3:处理链接服务器特殊问题 通过OLE DB调用时需注意: ```sql -- 使用OPENQUERY保证类型安全 DECLARE @sql NVARCHAR(MAX) = N' BEGIN HR.P_ABSENCE_DELETE_TW( P_EMP_ID => ''' + @EmployeeID + ''', P_START_DATE => TO_DATE(''' + @StartDate + ''',''YYYY-MM-DD''), P_END_DATE => SYSDATE, P_RESULT_CODE => :result ); END;'; EXEC('DECLARE res NUMBER; ' + @sql + ' SELECT res AS Result', res OUTPUT) AT [SAL_HCPPROD]; ``` #### 步骤4:类型转换处理 常见类型转换方案: | 传入类型 | 目标类型 | 转换方法 | |----------|----------|----------| | VARCHAR2 | DATE | `TO_DATE('2023-01-01','YYYY-MM-DD')` | | NUMBER | VARCHAR2 | `TO_CHAR(123)` | | TIMESTAMP| DATE | `CAST(systimestamp AS DATE)` | --- ### 预防措施 1. **使用命名参数法**(推荐): ```sql P_ABSENCE_DELETE_TW( P_EMP_ID => value1, P_START_DATE => value2 ) ``` 2. **添加参数验证函数**: ```sql CREATE OR REPLACE FUNCTION VALIDATE_PARAMS(...) RETURN BOOLEAN AS BEGIN -- 参数检查逻辑 END; ``` 3. **错误日志记录**: ```sql EXCEPTION WHEN OTHERS THEN INSERT INTO error_log VALUES (SQLERRM); ``` --- ### 调试建议 1. 使用Oracle SQL Developer的**调试模式** 2. 在存储过程内部添加跟踪日志: ```sql DBMS_OUTPUT.PUT_LINE('Received P_EMP_ID: ' || P_EMP_ID); ``` 3. 测试最小用例: ```sql -- 最小参数集测试 BEGIN P_ABSENCE_DELETE_TW('TEST01', SYSDATE, SYSDATE); END; ``` > ⚠️ 关键提示:链接服务器调用时,字符集问题可能导致隐式转换错误,建议使用`NCHAR`/`NVARCHAR2`处理多语言数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值