1

对不起,这个非常笼统的标题,想不出用简短的词来表达它的最佳方式。我对不同客户的一些出口有疑问。它们是针对每个客户的相同查询,但按 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;

现在,我确实相信我可以更改DECLAREto var,删除BEGINandEND;,然后将第一个查询作为子查询放在第二个查询中,这应该可以工作。但是,我试图保持它在它所在的包中的结构。我不想运行这个代码在包中的过程,因为有更新和插入语句。我只想运行此查询,以便在实际执行我想要它执行的操作之前查看可能发生的情况。我将与一位同事共享这个工作空间,我不希望他们太困惑。在原始包中,查询被放入游标中,游标是最终导出的过程的输出参数。如果你能提供帮助,我真的很感激。此外,Benthic Golden 是我们开发人员用来与 Oracle 交互的实用程序,因为这是我们公司拥有的许可证(我相信我们不能使用其他套件)。

4

2 回答 2

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;
于 2012-08-24T13:06:02.463 回答
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才能查看其内容,而听起来您的客户端会自动处理它。

于 2012-08-24T16:56:51.263 回答