sql - 如何按字段名称传递顺序以选择游标内的查询
问题描述
如何在游标选择查询中通过列名动态传递顺序,这些字段名值作为过程输入。
声明了一个局部变量并尝试追加到游标中的选择查询。
CREATE OR REPLACE PROCEDURE biq_security_report (
out_chr_err_code OUT VARCHAR2,
out_chr_err_msg OUT VARCHAR2,
out_security_tab OUT return_security_arr_result,
in_sort_column IN VARCHAR2,
in_order_by IN VARCHAR2
) IS
l_chr_srcstage VARCHAR2(200);
l_chr_biqtab VARCHAR2(200);
l_chr_srctab VARCHAR2(200);
l_chr_bistagtab VARCHAR2(200);
l_chr_err_code VARCHAR2(255);
l_chr_err_msg VARCHAR2(255);
l_out_chr_errbuf VARCHAR2(2000);
lrec return_security_report;
CURSOR cur_security_data IS
SELECT
"ID" "requestId",
"ROOM" "room"
FROM
"BI_REQUEST_CATERING_ACTIVITY"
WHERE
id > 2000
AND room < 400
ORDER BY
in_sort_column ASC;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('HERE INSIIDE OTHERS' || sqlerrm);
END;
在游标选择查询中,我们需要通过过程调用传递值。
解决方案
case
我建议为每一列使用单独的表达式:
ORDER BY (CASE WHEN in_sort_column = 'id' THEN id END),
(CASE WHEN in_sort_column = 'room' THEN room END),
. . .
是可选的ASC
,因为这是默认排序。
为什么要使用单独的CASE
表达式?简单的。CASE
表达式返回单个值,具有单一类型。您不希望CASE
开始将值转换为意外类型——创建转换错误或意外排序。
编辑:
要同时处理升序和降序:
ORDER BY (CASE WHEN in_sort_column = 'id' AND in_order_by = 'ASC' THEN id END) ASC,
(CASE WHEN in_sort_column = 'id' AND in_order_by = 'DESC' THEN id END) DESC,
. . .
推荐阅读
- unity3d - 更改玩家位置后对象不看/朝玩家移动 - Unity
- python - Convert integer to timedelta with pandas
- java - 布局不膨胀
- c# - 如何更改实时图表中标签的颜色?wpf
- dataframe - 删除 pyspark 数据框中的空行
- android - 无法运行模拟器:AVD 'Nexus_5X_API_28'
- javascript - 简单的 for 循环、if 语句和输出消息
- node.js - How to return a string from a node js api call
- php - AJAX - 用于查询的href中的动态数据
- python - Connect nodes in a graph when one attribute is the same (NetworkX)