【发布时间】: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,非常感谢。