Sql 如何通过字段名将订单传递给游标中的slect查询

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

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

声明了一个局部变量,并尝试将其追加到游标中的select查询

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

列,而不是字段…但如果用户需要按描述顺序排序。?