2012-09-18 1 views
0

다음은 ORM for .NET PetaPoco에 의해 생성 된 쿼리입니다. Oracle 클라이언트를 지금 디버그 할 필요가 없으며 분명히 잘못된 것을 볼 수 없습니다 (하지만 SQL Server 사용자). 그것은이 오류가 발생하는 이유 사람이 말해 줄 수 :이 Oracle 쿼리의 문제점은 무엇입니까?

Oracle.DataAccess.Client.OracleException ORA-00923: FROM keyword not found where expected

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) peta_rn, 
"ON_CUST_MAS"."CU_NO", 
"ON_CUST_MAS"."CU_NAME", 
"ON_CUST_MAS"."CU_TYPE", 
"ON_CUST_MAS"."CONTACT", 
"ON_CUST_MAS"."ADD1_SH", 
"ON_CUST_MAS"."ADD2_SH", 
"ON_CUST_MAS"."CITY_SH", 
"ON_CUST_MAS"."POST_CODE", 
"ON_CUST_MAS"."PROV_SH", 
"ON_CUST_MAS"."COUNTRY", 
"ON_CUST_MAS"."PHONE_NU", 
"ON_CUST_MAS"."FAX_NU", 
"ON_CUST_MAS"."EMAIL", 
"ON_CUST_MAS"."PU_ORDER_FL", 
"ON_CUST_MAS"."CREDIT_AMOUNT" 
FROM "ON_CUST_MAS") peta_paged 
WHERE peta_rn>0 AND peta_rn<=20 

편집 :이 도움이 그냥 경우에, 이것은 페이징 쿼리입니다. 일반 검색어 (모두 선택, ID로 선택)는 정상적으로 작동합니다.

+1

PetaPoco 또는 NPoco의 내 (schotime) 지점에서 수정되었지만 지정하고 주문하면 항상 작동해야합니다. – Schotime

+0

@Schotime cool 감사합니다. 주문하지 않은 유일한 이유는 단위 테스트 였기 때문에 주문을 추가하는 것은 큰 문제가 아니기 때문입니다. – Terry

+0

@Schotime new 어딘가에서 당신의 이름을 알았습니다. 당신의 [게시물]을 읽었습니다. (http://schotime.net/blog/index.php/2011/05/04/petapoco-why-im-using-a- micro-orm /)을 몇 번이나 사용하십시오 :) – Terry

답변

4

문제는 분석 함수의 ORDER BY 절에있는 SELECT NULL이 구문 상 올바르지 않다는 점입니다.

over (ORDER BY (SELECT NULL)) 

은 정말 당신에 의해 결과를 주문하지 않는 경우 row_number를 얻을 수 이해가되지 않습니다,

(ORDER BY (SELECT NULL from dual)) 

또는 물론 더 간단하게

(ORDER BY null) 

를 다시 작성할 수 있습니다 아무것도. 반환되는 행 집합이 일관성이 있다고 기대할 이유가 없습니다. 임의로 20 행을 얻을 수 있습니다. 결과의 두 번째 페이지로 이동하면 결과의 두 번째 페이지가 첫 번째 페이지와 완전히 다르거 나 전체 결과 세트로 페이지를 이동하면 특정 결과가 페이지에 표시 될 것으로 예상 할 이유가 없습니다.

+0

"* 결과를 아무 것도 주문하지 않으면 row_number를 얻는 것이 실제로 의미가 없습니다. *"쿼리는 툴에 의해 생성되며, 'ORDER BY'를 (아직) 전달하지 않아서 SQL이 불필요하게 생성됩니다. 당연히 당신은 도구가 그것을 고려해야한다고 주장 할 수 있습니다. 그러나 그것은 GitHub 페이지를위한 것입니다 :) – Terry

+0

'ORDER BY '를 지정하면 문제가 해결되었습니다. – Terry

0

ORDER BY 절 내에 정의 된 순서가 있어야합니다. 이것은 단지 BY 절 ORDER 내에서 전환 순서를 설정하는 다른 열 경우

SELECT * 
FROM (SELECT Row_number() 
       over (
        ORDER BY ("on_cust_mas"."cu_no")) peta_rn, 
       "on_cust_mas"."cu_no", 
       "on_cust_mas"."cu_name", 
       "on_cust_mas"."cu_type", 
       "on_cust_mas"."contact", 
       "on_cust_mas"."add1_sh", 
       "on_cust_mas"."add2_sh", 
       "on_cust_mas"."city_sh", 
       "on_cust_mas"."post_code", 
       "on_cust_mas"."prov_sh", 
       "on_cust_mas"."country", 
       "on_cust_mas"."phone_nu", 
       "on_cust_mas"."fax_nu", 
       "on_cust_mas"."email", 
       "on_cust_mas"."pu_order_fl", 
       "on_cust_mas"."credit_amount" 
     FROM "on_cust_mas") peta_paged 
WHERE peta_rn > 0 
     AND peta_rn <= 20 

: 예를 들어, 쿼리가 같이 있어야하는 것보다 당신의 요소, 열 "on_cust_mas"."cu_no"의 순서로 표시됩니다 말할 수 있습니다. 실제로 정의 된 순서가 있어야합니다. 그렇지 않으면 변경되지 않을 것이라는 보장이 없으며 페이지에 표시 될 내용을 확신 할 수 없습니다.