【问题标题】:How can i build a dynamic order by in oracle sql我如何在 oracle sql 中构建动态订单
【发布时间】:2013-12-07 17:38:09
【问题描述】:

注意:p_sort_field & p_order_by are NVARCHAR2 存储过程的参数

SELECT ... FROM table
ORDER BY CASE WHEN p_sort_field = 'name' THEN table.Name END ASC

这行得通...

ORDER BY CASE WHEN p_sort_field = 'name' THEN table.Name ASC END

这行不通..

所以我需要做这样的事情

SELECT ... FROM table
ORDER BY CASE WHEN p_sort_field = 'name' THEN table.Name END
CASE WHEN p_order_by = 'asc' THEN 
  ASC
ELSE
  DESC
END

这不起作用,..有人知道我怎样才能让它工作吗? 我需要将ASC or DESC 动态附加到ORDER BY

提前致谢。

编辑

我接受了你的建议,它肯定会奏效。但是使用下面发布的完全修改的存储过程,我的客户在以下位置收到以下错误: using(OracleDataReader reader = cmd.ExecuteReader() { .... }

ORA-00604: 递归 SQL 级别 1 发生错误, ORA-01003: 没有解析语句

如您所见,我正在尝试进行分页和排序。分页效果很好,而且一直都有,但是在这篇文章中,我正在尝试集成排序(通过多个字段)

非常感谢任何解决上述错误的帮助!

PROCEDURE sp_se_paged_list 
(
        p_sort_field           IN VARCHAR2,
        p_order_by             IN VARCHAR2,
        p_page_index           IN NUMBER,
        p_page_size            IN NUMBER,
        p_total_count          OUT NUMBER,
        list_cursor            OUT SYS_REFCURSOR
)
   IS
   v_select_stmt VARCHAR2(4000);
   BEGIN
       v_select_stmt := 'SELECT * FROM (';     
       v_select_stmt := v_select_stmt || 'SELECT p.*, RowNum rnum FROM(';
       v_select_stmt := v_select_stmt || 'SELECT * FROM se s ORDER BY s.';
       v_select_stmt:= v_select_stmt || p_sort_field;
       v_select_stmt:= v_select_stmt ||' '|| p_order_by;         
       v_select_stmt:= v_select_stmt || ') p';
       v_select_stmt:= v_select_stmt || 'WHERE RowNum <= p_page_index + p_page_size)';
       v_select_stmt:= v_select_stmt || 'WHERE rnum >= p_page_index + 1';
    OPEN list_cursor FOR v_select_stmt;
    SELECT COUNT(*) into p_total_count from se;
    EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('ERROR'||SQLERRM);                        
END sp_se_paged_list;

【问题讨论】:

  • 没关系,我让它工作了,只需将 2 IN 参数(p_page_index 和 p_page_size)移到 v_select_stmt 字符串连接之外。谢谢 Gaurav,非常感谢。

标签: sql oracle dynamic plsql


【解决方案1】:
--I think your procedure should look like this as shown below 
--Is your p_sort_field is fixed ,then go for your solution of case 
--,but then what is the use of p_sort_fielf as input parameter.  

CREATE OR REPLACE PROCEDURE temp
                   (p_sort_field  IN    VARCHAR2
                   ,p_sort_order  IN    VARCHAR2
                   ,p_ref_cur       OUT SYS_REFCURSOR
                   )
 IS
   v_select_stmt  VARCHAR2(2000);
 BEGIN
     v_select_stmt:='SELECT * FROM table ORDER BY table.';
     v_select_stmt := v_select_stmt||p_sort_field ;
     v_select_stmt := v_select_stmt||' '||p_order_by ;

     OPEN p_ref_cur FOR v_select_stmt  ;

 EXCEPTION 
   WHEN OTHERS THEN
     DBMS_OUTPUT.PUT_LINE('ERROR'||SQLERRM); 

 END temp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多