【问题标题】:PLSQL: Procedure outputting multiple cursorsPLSQL:输出多个游标的过程
【发布时间】:2012-01-04 00:56:20
【问题描述】:

我想在一个过程中返回多个游标,一个基于另一个。

我目前的代码是:

TYPE REFCURSOR IS REF CURSOR; 

PROCEDURE GETCARS(oCARS OUT REFCURSOR)
BEGIN
    OPEN oCARS FOR SELECT * FROM CARS;
END GETCARS;

我不确定这是否可行,但我想做类似的东西:

PROCEDURE GETCARS(oCARS OUT REFCURSOR, oREPAIRS OUT REFCURSOR)
BEGIN
    OPEN oCARS FOR SELECT * FROM CARS;
    ..??..
END GETCARS;

它将作为第二个参数返回与当前获取的 oCARS 行相关的所有修复。 (Table repairs 有一个来自汽车的 id_car 的 FK)

现在我在 C# 端执行此操作,当我从 oCARS 游标中获取一行时,我调用第二个程序,它会为我提供修复列表,但也许有可能在一个程序中做到这一点(这会给我带来性能提升?-我不想使用 join,因为它每次维修都会返回成倍的汽车)

【问题讨论】:

  • 为什么没有 2 个程序(getcars 和 getrepairs)?或者更好的是,只需在需要时选择所需的内容:select * from cars 而不是 exec getcars()
  • 调用平面选择不如调用参数化过程安全(sql注入保护)。我认为调用 2 个程序的效率较低.. 我希望在这里获得其他人的一些经验..
  • 调用正确参数化的选择语句并不比调用过程安全。只要不将参数值连接到 select 语句中,就没有 SQL 注入的向量。

标签: oracle plsql


【解决方案1】:

简单的答案是你不能做你正在尝试的事情。

游标基本上只是指向包含查询结果的结果集开头的指针。在您获取一行之前,无法知道该行将包含什么。因为您的应用程序而不是 PL/SQL 代码正在执行提取,所以 PL/SQL 部分不知道返回的值。

要执行您正在尝试的操作,数据库必须检测第一个查询的提取,使用第二个查询创建一个新结果集,然后将新结果集放置在该过程最初为第二个光标。数据库并不是为处理此类操作而设计的。

【讨论】:

    【解决方案2】:

    怎么样

    PROCEDURE GETCARS(oCARS OUT SYS_REFCURSOR, oREPAIRS OUT SYS_REFCURSOR, oCHARGES OUT SYS_REFCURSOR) 
    BEGIN 
        OPEN oCARS FOR SELECT * FROM CARS; 
        OPEN oREPAIRS FOR SELECT * FROM REPAIRS;
        OPEN oCHARGES FOR SELECT * FROM CHARGES;
    END GETCARS; 
    

    分享和享受。

    【讨论】:

    • 当我想退回所有 oCars 时,这很好,几乎很好。但是,如果我添加一些额外的代码,对于某些字段的分页或日期限制,休息游标会给我带来比我需要的更多的回报。我希望有一些想法,这将允许我绑定到 oCars 中当前获取的行的 id,并基于该修改返回 oRepairs。类似于:OPEN oRepairs for select * from repairs where id_car = ocars.id_car 我不确定这是否可行。
    • @XXs - 你为什么不详细说明你的全部要求,而不是用这种“是但”的废话来浪费人们的时间?
    • 了解如何阅读“它将作为第二个参数返回与当前获取的 oCARS 行相关的所有修复。”。是的,我想通过游标返回整个数据库来提高性能。-.- 哈哈,当我在这里提出问题时,我要求的是可扩展的解决方案,而不是最简单的解决方案。
    猜你喜欢
    • 2020-05-14
    • 2018-01-02
    • 2019-05-24
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2016-02-03
    相关资源
    最近更新 更多