Sql 如何通过字段名将订单传递给游标中的slect查询
如何在游标选择查询中按列名动态传递订单,这些字段名值作为过程输入 声明了一个局部变量,并尝试将其追加到游标中的select查询Sql 如何通过字段名将订单传递给游标中的slect查询,sql,oracle,plsql,Sql,Oracle,Plsql,如何在游标选择查询中按列名动态传递订单,这些字段名值作为过程输入 声明了一个局部变量,并尝试将其追加到游标中的select查询 CREATE OR REPLACE PROCEDURE biq_security_report ( out_chr_err_code OUT VARCHAR2, out_chr_err_msg OUT VARCHAR2, out_security_tab OUT
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;
在游标选择查询中,我们需要通过过程调用传递值。您可以尝试以下逻辑:
SELECT
"ID" "requestId",
"ROOM" "room"
FROM
"BI_REQUEST_CATERING_ACTIVITY"
WHERE
ID > 2000
AND ROOM < 400
ORDER BY
CASE
WHEN UPPER(IN_ORDER_BY) = 'DESC'
AND IN_SORT_COLUMN IS NOT NULL THEN IN_SORT_COLUMN
END DESC,
CASE
WHEN IN_SORT_COLUMN IS NOT NULL THEN IN_SORT_COLUMN
END;
干杯 in_sort_列是一个字符串文本,如果按它排序,则每行的值都是常量。相反,您需要将您输入的字符串文本映射到列,这可以在CASE语句中完成,在该语句中,您可以白名单列名:
游标cur\u security\u数据为
选择ID作为requestId,
房间
来自BI_请求_餐饮_活动
其中id>2000
房间<400
订购人
“排序”列中的大小写
当'ID'时,则为'ID'
什么时候是“房间”然后是“房间”
当“COLUMN1”时,然后是COLUMN1
当“COLUMN2”时,然后是COLUMN2
ELSE column3-要排序的默认列
结束ASC;
注意:除非有合适的真实商业案例,否则不要重复引用标识符。双引号强制标识符区分大小写,这意味着每次引用标识符时必须使用大小写字符的精确组合。相反,只需将标识符保留为不带引号的,并让Oracle管理区分大小写的功能,未来的开发人员将更容易使用代码。我建议为每一列使用单独的大小写表达式:
ORDER BY (CASE WHEN in_sort_column = 'id' THEN id END),
(CASE WHEN in_sort_column = 'room' THEN room END),
. . .
ASC是可选的,因为这是默认顺序
为什么要使用单独的大小写表达式?易于理解的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,
. . .
列,而不是字段…但如果用户需要按描述顺序排序。?