2012-07-27 2 views
0

다음은 oracle 저장소 프로 시저입니다.oracle의 동적 페이징 문제

여기서 전달하는 테이블 이름은 동적입니다.

PROCEDURE LG_UTIL_GET_TABLE 
(
    p_table_name VARCHAR,  
    pageNumber Number, 
    pageSize Number, 
     p_cursor OUT types.cursor_type 
) 
AS  

BEGIN 

    OPEN p_cursor FOR  

    SELECT * FROM 
    SELECT a.*, rownum r__ 

FROM 
    (

     'Select * from ' || p_table_name 

    ) a 
    WHERE rownum < ((pageNumber * pageSize) + 1) 

WHERE r__ >= (((pageNumber-1) * pageSize) + 1)  ; 



END ; 

그러나 저장 프로 시저가 컴파일되지 않습니다. 내가이 쿼리

Select * from Customer 

를 사용하는 대신 경우 때문에이 라인의

,

Select * from ' || p_table_name 

, 그것은

를 컴파일 도착하지만, 테이블 이름은 동적이어야한다.

이 문제를 해결하는 데 도움을주십시오.

답변

2

동일한 커서에서 동적 SQL과 정적 SQL을 혼합하고 있습니다. 그렇게 할 수 없습니다. 다음과 같이 모두 동적으로 만듭니다.

PROCEDURE LG_UTIL_GET_TABLE 
(
    p_table_name VARCHAR,  
    pageNumber Number, 
    pageSize Number, 
     p_cursor OUT types.cursor_type 
) 
AS  

BEGIN 

    OPEN p_cursor FOR  

    'SELECT * FROM 
    SELECT a.*, rownum r__ 
    FROM 
    (Select * from ' || p_table_name || ') a 
    WHERE rownum < ((:pageNumber * :pageSize) + 1) 
    WHERE r__ >= (((:pageNumber-1) * :pageSize) + 1)' 

    USING pageNumber, pageSize, pageNumber, pageSize; 

END ; 

이제 값에 대해 바인드 변수를 사용합니다.

+1

SQL 문에 4 개의 바인드 변수가 있으므로'USING pageNumber, pageSize, pageNumber, pageSize'를 원한다고 생각합니다. –

+0

@JustinCave, 고마워 - 수정. –

+0

죄송합니다. – kamal