0

下面是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

, 它被编译

但表名应该是动态的。

请帮我解决这个问题。

4

1 回答 1

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 ;

请注意,您现在对值使用绑定变量。

于 2012-07-27T10:01:02.203 回答