首页 > 解决方案 > 如何按字段名称传递顺序以选择游标内的查询

问题描述

如何在游标选择查询中通过列名动态传递顺序,这些字段名值作为过程输入。

声明了一个局部变量并尝试追加到游标中的选择查询。

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;

在游标选择查询中,我们需要通过过程调用传递值。

标签: sqloracleplsql

解决方案


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,
         . . .

推荐阅读