0

一些背景:

我的框架jQuery jTable允许我对列进行分页和排序,在我的选择查询中,我需要检索 n 行(从第 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;

这项工作成功,我使用以下参数(PRMROWMIN = 6,PRMROWMAX = 9)执行程序,程序的结果在Output Varibles window.

从过程中检索的数据

现在是下一步,我需要在从 n 行到 x 行之前对数据进行排序。

我重写了执行此操作的过程,但不起作用:

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):

带有内部顺序的程序不起作用

如何达到我的要求?

提前致谢。

4

2 回答 2

0

这是你的order by

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

它没有应用该功能lower()。相反,它正在连接字符串。你可能的意思是:

          order by LOWER(PRMORDERCOL) ' ' || PRMORDERDIR
于 2014-06-16T12:16:57.857 回答
0

我找到了满足我要求的解决方案。

  • 我需要使用 DECODE 来匹配每一列进行排序。
  • 我可以在子查询中订购,在这种情况下,我order by在两个子查询中执行两个。

DECODEPL/SQL函数 的文档在: PL/SQL DECODE FUNCTION

最后的程序是:

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;

感谢 Jack David Baucum在那里我找到了解决方案。

于 2014-06-16T14:21:14.530 回答