我们最近从 Oracle 10g 升级到 11g,现在 microsoft provider MSDAORA.1
将无法工作。我已改为使用 OraOLEDB.Oracle
提供程序,但现在我的一个返回结果集的存储过程也无法正常工作。
旧调用:
strSQL = "{调用 SYSADM.lss_pkg_catalog_pages.get_catalog_pages(?,{resultset 100, lss_media_cd, lss_page_num})}"
所以我一直试图改变它以返回参数值,但我不断收到以下错误:Error: -2147217900 - ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'GET_CATALOG_XXX' ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'GET_CATALOG_XXX' ORA-06550: line 1, column 7: PL/SQL: Statement ignored
我猜这是因为我的输出参数的数据类型,但似乎无法找到正确的类型来使用。
这是我使用的代码:
dim con, rst1, prm1, prm2, prm3, prm4
set cmCmd = Server.CreateObject("ADODB.Command")
set con = Server.CreateObject("ADODB.Connection")
Set Rst1 = Server.CreateObject("ADODB.Recordset")
Con.Provider = "OraOLEDB.Oracle"
Con.ConnectionString = "Data Source=XXXXXX;Password=XXXXXX;User ID=XXXXX;Persist Security Info=True"
Con.Open
cmCmd.ActiveConnection = Con
cmCmd.CommandType = adCmdText
Set Prm1 = cmCmd.CreateParameter("PRODUCT_ID", adVarChar, adParamInput, 20, strTempProductID)
cmCmd.Parameters.Append Prm1
Set Prm2 = cmCmd.CreateParameter("LSS_MEDIA_XX", adVarWChar, adParamOutput, 100)
cmCmd.Parameters.Append Prm2
Set Prm3 = cmCmd.CreateParameter("LSS_PAGE_XXX", adVarWChar, adParamOutput, 100)
cmCmd.Parameters.Append Prm3
strSql = "{ CALL SYSADM.lss_pkg_catalog_pages.get_catalog_pages(?, ?, ?) }"
cmCmd.CommandText = strSql
cmCmd.Execute
我有其他直接的 SQL 和其他存储过程调用,它们返回数据就好了,只是这个存储过程不能正常工作。
编辑:
我被问到 Oracle 存储过程中的类型声明:
TYPE t_lss_media_XXX is TABLE of ps_lss_cat_XXXX.lss_XXX%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_lss_page_XXX is TABLE of ps_lss_cat_XXXX.lss_XXXX%TYPE
INDEX BY BINARY_INTEGER;
如果存储过程中需要更多信息,请告诉我,我可以发布。
任何建议将不胜感激。
谢谢罗伯特
最佳答案
根据@searchAnResQ 在评论中的建议,我让我们的 oracle 团队重做存储过程以返回 Ref Cursor,这似乎成功了。我发现我们正在使用的 ODAC 版本不支持返回表。