很抱歉这个非常通用的标题,想不出用简短的话说出来的最佳方法。我对不同客户的一些出口有疑问。它们是针对每个客户的相同查询,但是通过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
,删除BEGIN
和END;
,然后将第一个查询作为子查询放入第二个查询,这应该工作。但是,我正在尝试将其保持为在它所在的包中的结构。我不想运行此代码在Package中的过程,因为有update和insert语句。我只想运行这个查询,这样我才能看到在实际执行它之前可能会发生什么。我将与同事一起分享这个工作区,我不希望他们太困惑。在原始包中,查询被放入游标中,该游标是最终导出的过程的out参数。如果你能提供帮助,我真的很感激。此外,Benthic Golden是我们的开发人员用来与Oracle进行交互的实用工具,因为这是我们公司的许可证(我们不能使用我认为的其他套件)。非常感谢你。
答案 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
才能看到它的内容,而听起来您的客户端会自动处理它。