【问题标题】:What is the name of the 'resultset' argument in an ADODB.Command calling an Oracle stored procedure in Classic.ASP?ADODB.Command 中调用 Classic.ASP 中的 Oracle 存储过程的“结果集”参数的名称是什么?
【发布时间】:2019-07-24 11:19:23
【问题描述】:

我很高兴使用 Classic.ASP 作为前端并使用 Oracle 数据库作为后端来维护旧应用程序。

我们有一个持续存在的问题,我们需要定期更新如下查询,以使“结果集”参数的值不断增加

Set cmdStoredProc = Server.CreateObject("ADODB.Command")
cmdStoredProc.CommandText = "{call package_name.Procedure_Name(?,{resultset 1500, v_out_one, v_out_two})}"

它从 500 开始,然后一个错误修复使它成为 1000,然后是 1500,现在它再次成为我手表上的一个问题。

与其追随我前任的脚步并随意增加它,我想尽可能多地了解此功能,但我很难找到有关它的任何文档。

这个特性/参数/参数是否有一个特定的名称?知道这应该足以让我找到更多关于它的信息,但只需简要说明或链接到它的文档会有优势的。


从 cmets / answers 很明显,定义被调用的过程可能很有用:

PROCEDURE Procedure_Name
   (n_site_id_in IN TABLENAME.site_org_id%TYPE,
    v_out_one OUT t_c_out_one,
    v_out_two OUT t_c_out_two)
IS   
--Select the CC and account code and descriptions into a cursor
CURSOR c1 IS
SELECT a.out_one,
       a.out_two
FROM  TABLENAME a
WHERE a.site_org_id = n_site_id_in
ORDER BY a.out_one, a.out_two;

i INTEGER DEFAULT 1;

BEGIN

  FOR get_c1 IN c1 LOOP
   v_out_one(i) := get_c1.out_one;
   v_out_two(i) := get_c1.out_two;

   i := i + 1;
  END LOOP;

EXCEPTION
WHEN NO_DATA_FOUND THEN
 DBMS_OUTPUT.PUT_LINE('no data found');
WHEN OTHERS THEN
 DBMS_OUTPUT.PUT_LINE('sqlerrm '||SQLERRM);
 RAISE;
END Procedure_Name;

由此我们可以看到该过程定义了 3 个参数,1 个 IN 和 2 个 OUT,但对该过程的调用似乎将 2 个 OUT 参数转换为基于结果集的集合。

正在使用的驱动程序是“Microsoft ODBC for Oracle”(MSORCL32.DLL)

【问题讨论】:

  • 我认为了解您使用的数据库引擎在这里可能比开发语言更有用,因为它似乎与call procedure 参数非常相关
  • 感谢@OlivierDepriester,为问题添加了详细信息。
  • 抱歉,您用来连接 Oracle 的连接提供程序似乎也很重要:我发现一些文章说如果您使用 OraOLEDB.Oracle,则不应将此参数绑定到调用。您必须在连接字符串中包含它
  • 道歉@OlivierDepriester,这里的术语有时会让我感到困惑,您是否在寻找我使用的驱动程序:'Microsoft ODBC for Oracle'(通过 ODBC 数据源管理器找到)

标签: oracle asp-classic odbc ado terminology


【解决方案1】:

您的过程package_name.Procedure_Name 必须返回一个游标作为输出参数。
这个resultset参数让我想到了一个定义同时可以打开的游标数量的参数。
事实是它似乎不是正确的做事方式,因为这意味着每次调用过程时,游标都没有关闭。
在您的代码中,您必须具有类似

的 stg
Set myRecordSet = cmdStoredProc.Execute()

此记录集用于读取游标内容。 请检查它是否在使用后关闭

myRecordSet.Close()
Set myRecordset = Nothing

【讨论】:

  • 有趣啊。是的,程序中有一个游标。我认为它不是 out 参数的一部分,因为它没有在程序的签名中提及。这给了我一个很好的线索,谢谢。
  • 我已将程序的详细信息添加到问题中。如您所见,它确实使用了您所怀疑的光标。不过,我的问题仍然存在,尽管您的回答肯定有助于改进事情,但我认为它并不能完全解决我正在寻找的问题。如果您有兴趣更新它,那么我要查找的是这种调用方式的术语/解释/文档,其中 resultset 似乎被用于创建输出参数数组而不是它们直接设置。到目前为止帮助很大,再次感谢。
  • 您发布了存储过程代码,这是一件好事。这不是游标问题。您的 2 个 OUT 变量是数组,resultset 1500 设置这些数组的最大长度。我猜 SP 内的SELECT a.out_one, a.out_two FROM TABLENAME a WHERE a.site_org_id = n_site_id_in ORDER BY a.out_one, a.out_two; 查询返回的行数会不时增加,您得到的错误相当于“越界”
  • 是的,我想我们已经找到了答案。但是您似乎在试图解决这种“风格”造成的问题时受到了关注,尽管我很感激,但请不要!我正在寻找有关这种“技术”的信息,而不是如何解决问题(我只是为了上下文而提到的)!!自从我们交谈以来,我发现了一些其他似乎相关的有用问题:stackoverflow.com/questions/13494938/…stackoverflow.com/questions/23197422/…
  • 找到了我要找的东西 - docs.microsoft.com/en-us/sql/odbc/microsoft/… 如果您有兴趣调整您的答案以适应这个问题,我稍后会回到这个问题?如果没有,我会发布我自己的,但链接到您提供的帮助。
【解决方案2】:

'resultset' 参数没有任何特殊名称,它只是称为结果集参数。

有多种使用方式:

返回单个结果集中的所有列(当前状态):

Set cmdStoredProc = Server.CreateObject("ADODB.Command")
cmdStoredProc.CommandText = "{call package_name.Procedure_Name(?,{resultset 1500, v_out_one, v_out_two})}"

将每一列作为单个结果集返回(返回 2 个单独的结果集):

Set cmdStoredProc = Server.CreateObject("ADODB.Command")
cmdStoredProc.CommandText = "{call package_name.Procedure_Name(?,{resultset 1500, v_out_one}, {resultset 1500, v_out_two})}"

在此处了解更多信息:https://docs.microsoft.com/en-us/sql/odbc/microsoft/returning-array-parameters-from-stored-procedures

假设,它用于设置可以从过程调用返回的记录数量的限制。

该过程的定义表明它返回 2 个数组作为输出,因此如果其中任何一个超出结果集参数中设置的限制,则会引发错误。

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 2018-07-28
    • 2010-11-13
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2011-11-25
    • 2015-05-22
    相关资源
    最近更新 更多