用光标ORACLE替换SELECT INTO语句

时间:2012-07-25 13:08:17

标签: oracle plsql

这是查询。如何用游标替换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;

2 个答案:

答案 0 :(得分: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返回/操作单行,则需要修改查询以满足该要求。

答案 1 :(得分:3)

该错误告诉您查询返回的行数超过1行,因此您应该确定所需的行。这里是一个如何基于我在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'