Benthic Golden Workspace的问题

时间:2012-08-24 12:56:14

标签: oracle workspace

很抱歉这个非常通用的标题,想不出用简短的话说出来的最佳方法。我对不同客户的一些出口有疑问。它们是针对每个客户的相同查询,但是通过ID进行过滤。我想为每种不同类型的导出创建选项卡,并为每个选项卡中的不同客户提供变量,这样我就可以在任何客户的任何数据库实例上轻松运行它们。但是,最后一个语句是一个查询,我希望它在结果窗口中返回,但它告诉我它期待一个INTO语句。我对游标不是很好,我不确定这是不是正确的答案,但我想你会问你们所有人,因为你们过去都帮了我很多。感谢。

标签示例:

DECLARE  lEventID    INTEGER;
         lCustID     INTEGER := 1 -- Development Customer1
         --lCustID     INTEGER := 2 -- Development Customer2
         --lCustID     INTEGER := 3 -- Development Customer3
         --lCustID     INTEGER := 4 -- Development Customer4
         --lCustID     INTEGER := 5 -- Development Customer5
         --lCustID     INTEGER := 101 -- Testing Customer1
         --lCustID     INTEGER := 102 -- Testing Customer2
         --lCustID     INTEGER := 103 -- Testing Customer3
         --lCustID     INTEGER := 104 -- Testing Customer4
         --lCustID     INTEGER := 105 -- Testing Customer5
         --lCustID     INTEGER := 201 -- Production Customer1
         --lCustID     INTEGER := 202 -- Production Customer2
         --lCustID     INTEGER := 203 -- Production Customer3
         --lCustID     INTEGER := 204 -- Production Customer4
         --lCustID     INTEGER := 205 -- Production Customer5

BEGIN

    SELECT  EventID INTO lEventID
    FROM    Event
    WHERE   EventName = 'Event1'

    SELECT  Field1,
            Field2,
            Field3
    FROM    Table1
    WHERE   EventID = lEventID
      AND   CustomerID = lCustID;

END;

现在,我相信我可能会将DECLARE更改为var,删除BEGINEND;,然后将第一个查询作为子查询放入第二个查询,这应该工作。但是,我正在尝试将其保持为在它所在的包中的结构。我不想运行此代码在Package中的过程,因为有update和insert语句。我只想运行这个查询,这样我才能看到在实际执行它之前可能会发生什么。我将与同事一起分享这个工作区,我不希望他们太困惑。在原始包中,查询被放入游标中,该游标是最终导出的过程的out参数。如果你能提供帮助,我真的很感激。此外,Benthic Golden是我们的开发人员用来与Oracle进行交互的实用工具,因为这是我们公司的许可证(我们不能使用我认为的其他套件)。非常感谢你。

2 个答案:

答案 0 :(得分:1)

好吧,你没有在第二个SELECT语句中声明“INTO”,你总是可以使用这样的东西:

CURSOR mySqlStatement IS
SELECT  Field1,
            Field2,
            Field3
    FROM    Table1
    WHERE   EventID = lEventID
      AND   CustomerID = lCustID;

(进入DECLARE区域)

而不是SELECT ABC INTO你喜欢(在BEGIN之后)

FOR row_ IN mySqlStatement LOOP
//row_ gets generated automaticly and you can access colums as row_.columname
END LOOP;

答案 1 :(得分:1)

在PL / SQL块中,你必须选择某些东西;显式地转换为局部变量(您可以打印,如Najzero所示),或本地声明的游标以供以后操作或打印,或外部声明(ref)游标。

根据您的评论,而不是任何与此客户的经验,听起来您应该能够这样做:

var reccursor refcursor;

DECLARE
    lEventID    INTEGER;
    lCustID     INTEGER := 1;
BEGIN

    SELECT  EventID INTO lEventID
    FROM    Event
    WHERE   EventName = 'Event1'

    -- open an externally-declared ref cursor to hold the result of the query
    OPEN :reccursor FOR
        SELECT  Field1,
                Field2,
                Field3
        FROM    Table1
        WHERE   EventID = lEventID
          AND   CustomerID = lCustID;
END;
/

我想象的非常类似于你的程序,除了它将打开out参数引用游标而不是绑定变量。

这与您在SQL * Plus或SQL Developer中的操作相同,但是它们需要一个显式的print :reccursor才能看到它的内容,而听起来您的客户端会自动处理它。