2012-07-25 114 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在单行上返回/操作,则需要修改查询以满足该要求。