2014-01-09 20 views
0

我在myqsl中有一套函数,我需要编写oracle版本。ora-01744 PL/SQL oracle函数INTO

哪个进展顺利,直到我面对限制1问题。我认为我的查询限制是问题,但无法弄清楚什么是错的。你能帮我一下吗?

MySQL版本

SELECT concat(fld_name, ' ', fld_surname) 
    INTO info 
FROM tbl_customer 
WHERE fld_flat_id = flatId and fld_type = typeId 
order by fld_own_date desc limit 1; 

Oracle版本(造成的问题)

SELECT Q1.* 
FROM (
    SELECT ROWNUM AS RWNR2, Q2.* 
    FROM (
     SELECT (NAME || ' ' || SURNAME) 
      INTO info 
     FROM TB_CUSTOMER 
     WHERE FLAT_ID = flatId AND TYPE = typeId 
     ORDER BY OWN_DATE DESC 
    ) Q2 
    WHERE ROWNUM <= 1 
) Q1 
WHERE Q1.RWNR2 > 0; 

而且通过我知道,表名和字段是不同的方式,价值观念都在此预览正确。

+0

是啊我编辑该部分 – FreshPro

回答

3

INTO子句必须位于最外层的SELECT而不是内层。而且你不需要两层嵌套,一个派生表和一个rownum <= 1就足够了。

因此,它应该是这样的:

SELECT full_name 
    INTO info 
FROM (
    SELECT (NAME || ' ' || SURNAME) as full_name 
    FROM TB_CUSTOMER 
    WHERE FLAT_ID = flatId 
     AND TYPE = typeId 
    ORDER BY OWN_DATE DESC 
) Q2 
WHERE ROWNUM <= 1; 

注意,它仍然可能会失败,一个“没有发现行”错误,如果内部的选择不返回任何东西。

+0

好吧,似乎工作。我明白这一点。但有什么我可以做的“没有行发现”错误? – FreshPro

+1

@FreshPro:您需要在代码中正确捕获“no_data_found”异常并处理它。或者创建一个总是返回一些东西的SQL语句。 –

+0

哦,谢谢你的提示。我将只为信息返回一个空字符串。干杯 – FreshPro