2012-12-31 41 views
1

我修改了过程,使其更小,但我真的只想运行select查询一次。这将降低运行该程序的成本。如何在不运行查询两次的情况下获得prevContectIDnextContentID。这是取代以前的程序,所以我不想更改INOUT,所以我不必找到它被调用的每个地方。Oracle从包中选择查询返回两个变量

procedure getSeq(theContentID IN table.contentID%type, 
       prevContentID OUT table.contentID%type, 
       nextContentID OUT table.contentID%type) 
BEGIN 

    SELECT myPrev into prevContentID, myNext into nextContentID 
    from myTable 
    where contentID=theContentID; 
    RETURN; 
END getSeq; 
+0

哪里有两次跑?我只看到一个。 – kmkaplan

回答

5

显示的程序很可能不会编译。正确的语法为SELECT ... INTO使用几个变量是:

SELECT myPrev, myNext INTO prevContentID, nextContentID 
from myTable 
where contentID = theContentID; 
+0

我认为这可能很简单。谢谢。 –

1

您还可以使用光标从myTable。对于你的方法来读取值,你需要做适当的异常处理,当theContentID不存在在myTable中,因为这会给你带来NO_DATA_FOUND异常。

PROCEDURE getSeq (theContentID IN  table.contentID%TYPE, 
        prevContentID  OUT table.contentID%TYPE, 
        nextContentID  OUT table.contentID%TYPE) 
IS 
    CURSOR getcontentID_cur 
    IS 
     SELECT myPrev, myNext 
     FROM myTable 
     WHERE contentID = theContentID; 
BEGIN 
    OPEN getcontentID_cur; 

    FETCH getcontentID_cur 
    INTO prevContentID, nextContentID; 

    CLOSE getcontentID_cur; 
END getSeq; 
+0

theContentID将始终存在,因为我缩短了代码,并在运行select之前验证了contentID。我不想投入更多的代码来获得答案。科多给了我我需要的东西。 –

+0

@NathanStanford:更多代码的参数是什么?首先,通过扫描myTable来验证contentId。其次,你需要获取prev和next id的代码,这意味着你的整个过程将会扫描你的表格两次。用我的方法你可以做一次.Nyways只是建议你的方法的优点/缺点。谢谢 –

+0

对不起,它更复杂,然后就像代码所说的那样。大多数情况下我的运行时间少于15毫秒。所以我现在很好。感谢您的关注。由于某人正在做一个游标并获取所有内容,并通过循环来获取下一个,并且prev就是我们重写代码的原因。我们现在使用Lag(),Lead()来获得prev和Next。此外,当我们得到First_Value(),然后Last_Value()允许前一个循环到列表的开始或结束时。 –