用游标替换SELECT INTO语句ORACLE
这是查询。如何用游标替换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;
该错误告诉您查询返回多于一行,所以您应该确定您需要哪一行。这里是一个例子,如何获取基于日期字段的最近行,我想在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'
您正在将窗口函数与聚合的['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
谢谢,文森特。我编辑了我的答案。为了测试我的查询,我懒得先创建表格。哎呦。 – winkbrace 2012-07-26 08:40:12
好吧,如果你想处理一个循环的多行,它是那样简单
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在单行上返回/操作,则需要修改查询以满足该要求。
通常人们正在寻找相反的东西。你的要求是什么? – RedFilter 2012-07-25 13:11:39
因为一个错误http://www.techonthenet.com/oracle/errors/ora01422.php – FrankSharp 2012-07-25 13:15:30
这意味着你应该编写你的查询返回1行。并且不要在rownum winkbrace 2012-07-25 13:18:15