2012-07-25 145 views
0

這是查詢。如何用遊標替換SELECT INTO語句?用遊標替換SELECT INTO語句ORACLE

我新手在甲骨文

感謝您的幫助

SELECT CEQ_LISTE_TYPE_QUESTIONS.ID_LISTE_TYPE_QUESTION 
     INTO vintIdListeTypeQuestion 
     FROM CEQ_FORMULAIRES 
     inner join CEQ_LISTE_TYPE_QUESTIONS 
      on CEQ_LISTE_TYPE_QUESTIONS.ID_LISTE_TYPE_FORMULAIRE=CEQ_FORMULAIRES.ID_TYPE_FORMULAIRE 
      AND CEQ_LISTE_TYPE_QUESTIONS.WEBCODE='ITEM_BETA_LACTAMASE' 
WHERE CEQ_FORMULAIRES.ID_FORMULAIRE=to_number(out_rec.ID_FORMULAIRE) 
and ceq_formulaires.date_inactive is null; 
+3

通常人們正在尋找相反的東西。你的要求是什麼? – RedFilter 2012-07-25 13:11:39

+0

因爲一個錯誤http://www.techonthenet.com/oracle/errors/ora01422.php – FrankSharp 2012-07-25 13:15:30

+0

這意味着你應該編寫你的查詢返回1行。並且不要在rownum <= 1的地方使用,因爲那會返回一個隨機行! – winkbrace 2012-07-25 13:18:15

回答

3

該錯誤告訴您查詢返回多於一行,所以您應該確定您需要哪一行。這裏是一個例子,如何獲取基於日期字段的最近行,我想在ceq_list_type_questions「some_date」中。

select max(q.id_liste_type_question) keep (dense_rank last order by q.some_date) into vintidlistetypequestion 
from ceq_formulaires f 
join ceq_liste_type_questions q on q.id_liste_type_formulaire = f.id_type_formulaire 
where f.id_formulaire = to_number(out_rec.id_formulaire) 
and f.date_inactive is null 
and q.webcode = 'ITEM_BETA_LACTAMASE' 
+1

您正在將窗口函數與聚合的['FIRST'](http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions065.htm#i1000901)修飾符混合在一起,工作。窗口函數(帶有「OVER」)不會聚合,因此會返回與原始行數相同的行數。 「FIRST」的正確合成是'MAX(...)KEEP(DENSE_RANK第一次命令BY YY)' – 2012-07-25 13:57:55

+0

謝謝,文森特。我編輯了我的答案。爲了測試我的查詢,我懶得先創建表格。哎呦。 – winkbrace 2012-07-26 08:40:12

3

好吧,如果你想處理一個循環的多行,它是那樣簡單

BEGIN 
    FOR curs IN (SELECT  ceq_liste_type_questions.id_liste_type_question 
       FROM  ceq_formulaires 
       INNER JOIN ceq_liste_type_questions ON ceq_liste_type_questions.id_liste_type_formulaire=ceq_formulaires.id_type_formulaire 
                AND ceq_liste_type_questions.webcode = 'ITEM_BETA_LACTAMASE' 
       WHERE  ceq_formulaires.id_formulaire = TO_NUMBER(out_rec.id_formulaire) 
       AND  ceq_formulaires.date_inactive IS NULL) 
    LOOP 
     DBMS_OUTPUT.PUT_LINE(curs.id_liste_type_question); -- do what you need to do 
    END LOOP; 
END; 
/

但是,正如BazzPsychoNut提到的那樣,如果要求您的SQL在單行上返回/操作,則需要修改查詢以滿足該要求。