2012-07-27 60 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 ' || p_table_name 

相反,如果我使用此查询

Select * from Customer 

,它被编译

但表的名称应该是动态的。

请帮我解决这个问题。

回答

2

你正在混合动态和静态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

我相信你希望'USING pageNumber,pageSize,pageNumber,pageSize'因为你在SQL语句中有4个绑定变量。 – 2012-07-27 10:02:44

+0

@JustinCave,谢谢 - 更正。 – 2012-07-27 10:16:47

+0

对不起,这是工作 – kamal 2012-07-29 18:37:46