2014-06-16 7 views
0

일부 배경 :하위 쿼리 (jQuery jTable)의 순서는 작동하지 않습니까?

내 프레임 워크 jQuery jTable은, 내가 매김을하고 내 선택 쿼리에서 나는 (n 번째로, n 번째부터) n 행을 검색해야하고 이전에 선택한 열을 기준으로 데이터를 주문, 열을 정렬 할 수 있습니다.

create or replace 
PROCEDURE PR_SHOWVALUESOLD 
(
    PRMROWMIN IN NUMBER 
, PRMROWMAX IN NUMBER 
, CURSORRESULT OUT SYS_REFCURSOR 
) AS 
BEGIN 
    open CURSORRESULT for 
    select * from 
     (select v.*, rownum r, 
          (
           select count(*) TOTALITEMS from TABLE1 v 
          ) TOTALITEMS 
       from TABLE1 v 
    ) d 
    where d.r >= PRMROWMIN and d.r <= PRMROWMAX; 

END PR_SHOWVALUESOLD; 
:

Data from my table

내가 후속 절차를 쓴 첫 번째 요구 사항을 달성하기 : (이 예입니다) 일부 행이 존재하지 않을 경우

나는 n 개의 열이있는 테이블이

이 작업은 성공적으로 다음 매개 변수 (PRMROWMIN = 6, PRMROWMAX = 9)로 프로 시저를 실행합니다. 프로 시저의 결과는 Output Varibles window입니다.

Data retrieved from procedure

이제 다음 단계를 제공, 내가 전에 데이터를 주문 X 행에 N 걸릴해야합니다.

나는이 작업을 수행하는 절차를 다시 있지만 작동하지 않는 다음 매개 변수는 다음과

CREATE OR REPLACE PROCEDURE PR_SHOWVALUES 
(
    PRMROWMIN IN NUMBER 
, PRMROWMAX IN NUMBER 
, PRMORDERCOL IN VARCHAR2 
, PRMORDERDIR IN VARCHAR2 
, CURSORRESULT OUT SYS_REFCURSOR 
) AS 
BEGIN 
    open CURSORRESULT for 
    select * from 
     (select v.*, rownum r, 
          (
           select count(*) TOTALITEMS from TABLE1 v 
          ) TOTALITEMS 
       from TABLE1 v 
       order by 'LOWER(' || PRMORDERCOL || ')' || ' ' || PRMORDERDIR 
    ) d 
    where d.r >= PRMROWMIN and d.r <= PRMROWMAX; 

END PR_SHOWVALUES; 

내가 수정 절차를 실행 :

PRMROWMIN := 6; 
    PRMROWMAX := 9; 
    PRMORDERCOL := 'COLUMNA'; 
    PRMORDERDIR := 'DESC'; 

내가 강조 표시된 행 Query Result 2 window에게 기대 (하지만 이 새 프로시 저는 오래되었지만 무질서한 데이터 (예 : Output Variables Window)를 검색합니다.

Procedure with inner order by doesn't work

내 요구 사항을 어떻게 달성합니까?

미리 감사드립니다.

+0

'ORDER BY'가 (가) INNER 쿼리에 있습니다. OUTER 부분으로 끌어 내야합니다. –

답변

0

내 요구 사항에 대한 해결책을 찾았습니다.

  • 정렬 할 모든 열과 일치 시키려면 DECODE를 사용해야합니다.
  • 하위 쿼리에서 주문할 수 있습니다.이 경우 두 개의 하위 쿼리에서 두 개의 을 수행합니다. PL/SQL DECODE FUNCTION

    마지막 절차는 다음과 같습니다 : 잭 데이비드 Baucum where

    CREATE OR REPLACE PROCEDURE PR_SHOWVALUES 
    (
        PRMROWMIN IN NUMBER 
    , PRMROWMAX IN NUMBER 
    , PRMORDERCOL IN VARCHAR2 
    , PRMORDERDIR IN VARCHAR2 
    , CURSORRESULT OUT SYS_REFCURSOR 
    ) AS 
    BEGIN 
    
        open CURSORRESULT for 
        select * from (
         select rownum r, v.* from 
          (
          select * from 
          (
           select * from table1 tbl 
           order by decode 
           (
           UPPER(PRMORDERCOL), 
           'COLUMNA', LOWER(tbl.COLUMNA), 
           'COLUMNB', LOWER(tbl.COLUMNB), 
           LOWER(tbl.TABLE1_ID) 
          ) 
          ) 
          ORDER BY 
           CASE 
           WHEN UPPER(PRMORDERDIR) = 'DESC' THEN 
            ROWNUM * -1 
           ELSE 
            ROWNUM 
           END  
         ) v 
        ) 
        where r >= PRMROWMIN and r <= PRMROWMAX; 
    
    END PR_SHOWVALUES; 
    

    승인이 나는 해결책을 발견

PL/SQL DECODE 기능의 문서에 있습니다.

0

이것은 당신의 order by :

  order by 'LOWER(' || PRMORDERCOL || ')' || ' ' || PRMORDERDIR 

그것은 기능 lower()을 적용하지 않습니다. 대신, 그것은 문자열을 연결합니다. 다음과 같은 의미 일 수 있습니다.

  order by LOWER(PRMORDERCOL) ' ' || PRMORDERDIR 
+0

작동하지 않습니다, 'LOWER (PRMORDERCOL) || ''|| PRMORDERDIR'. 동일한 데이터를 표시하십시오. –