我已经完成了所有类似的问题,但我没有成功。
在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之前添加之前,Add Function Import无法看到返回的列。
在我的程序中,使用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的多行错误的Oracle.DataAccess.Client.OracleException:
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 stored proc call returning exception ORA-06550 with PLS-00103
提前感谢您可以解决的任何问题。
答案 0 :(得分:0)
您是否以用户PARTNER身份连接到数据库?如果没有,那么也许这可能会有所帮助?
return base.ExecuteFunction<VANCE_TEST_Result>("PARTNER.VANCE_TEST");