我已经解决了所有类似的问题,但没有成功。
在 Visual Studio 2010 中,我正在创建一个调用 Oracle 存储过程的 MVC Web 应用程序。我什至无法调用一个非常简单的存储过程。这是一个简单的存储过程:
CREATE OR REPLACE PROCEDURE VANCE_TEST ( PARTNERS OUT sys_refcursor ) AS
BEGIN
OPEN PARTNERS FOR SELECT COMPANY_NAME, SUN FROM PARTNER WHERE MARKET_IDX = 16;
END;
/
两列都是 Varchar2 类型。当我从 SQL*Plus 调用该过程时,使用以下代码可以正常工作:
var rc refcursor
execute VANCE_TEST( :rc );
print rc;
在我的 web.config 文件中,我有以下规范来定义存储过程的游标:
<oracle.dataaccess.client>
<settings>
<add name="PARTNER.VANCE_TEST.RefCursor.PARTNERS" value="implicitRefCursor bindinfo='mode=Output'" />
<add name="PARTNER.VANCE_TEST.RefCursorMetaData.PARTNERS.Column.0" value="implicitRefCursor metadata='ColumnName=COMPANY_NAME;BaseSchemaName=PARTNER;BaseTableName=PARTNER;NativeDataType=Varchar2;ProviderType=Varchar2;ProviderDBType=String;DataType=System.String;ColumnSize=100;AllowDBNull=true'" />
<add name="PARTNER.VANCE_TEST.RefCursorMetaData.PARTNERS.Column.1" value="implicitRefCursor metadata='ColumnName=SUN;BaseSchemaName=PARTNER;BaseTableName=PARTNER;NativeDataType=Varchar2;ProviderType=Varchar2;ProviderDBType=String;DataType=System.String;ColumnSize=10;AllowDBNull=true'" />
</settings>
</oracle.dataaccess.client>
当我执行添加函数导入时,这工作得很好,并且 VS 能够为返回的数据创建一个复杂类型 VANCE_TEST_Result。PARTNER 是架构名称,并且添加函数导入无法看到返回的列,直到我在 VANCE_TEST 之前添加它。
在我的程序中,使用 Models.Entities 对 PARTNER 表进行 Linq 查询没有问题,我有以下代码:
using (Models.Entities db = new Models.Entities())
{
IEnumerable<Models.VANCE_TEST_Result> results = db.VANCE_TEST();
当我执行它时,我在 db.VANCE_TEST() 中得到一个异常:
public ObjectResult<VANCE_TEST_Result> VANCE_TEST()
{
return base.ExecuteFunction<VANCE_TEST_Result>("VANCE_TEST");
}
ExecuteFunction (我无法追踪)抛出一个 Oracle.DataAccess.Client.OracleException ,其中包含来自 Oracle 的多行错误:
ORA-06550: line 1, column 17:
PLS-00302: component 'VANCE_TEST' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
关于这里发生了什么的任何提示?或者我如何才能获得正在发送的实际 SQL 代码?我试图从其他 Stackoverflow 文章中学习,并在他们解决问题后尽可能多地这样做:
Oracle 存储过程调用返回异常 ORA-06550 和 PLS-00103
提前感谢您对此有所了解。