Plsql 在显式游标语句中使用变量的PL/SQL

Plsql 在显式游标语句中使用变量的PL/SQL,plsql,cursor,Plsql,Cursor,我声明了一个显式游标,但是,我需要根据用户交互对sql进行不同的排序。要排序的列作为参数传递给过程,但是,我很难将它合并到游标的sql中(据我所知,它将变量名解释为列的名称,因此不进行排序) 有没有办法在显式游标语句中使用本地声明的变量 以下是我目前尝试的基本框架: v_order_by varchar2(100) := <function that grabs URL param> c_cursor is select... . . . order by v_order_by;

我声明了一个显式游标,但是,我需要根据用户交互对sql进行不同的排序。要排序的列作为参数传递给过程,但是,我很难将它合并到游标的sql中(据我所知,它将变量名解释为列的名称,因此不进行排序)

有没有办法在显式游标语句中使用本地声明的变量

以下是我目前尝试的基本框架:

v_order_by varchar2(100) := <function that grabs URL param>
c_cursor is
select...
.
.
.
order by v_order_by;
varchar2的v_订单(100):= c_光标是 选择。。。 . . . 按v_顺序(order)按v_顺序(order);;
非常感谢您的帮助。到目前为止,我发现所有使用显式游标的示例都毫无帮助。

如果v_order_by的可能值是静态的,您可以这样做:

order by case v_order_by
            when 'EMPNO' then empno
            when 'DEPTNO then deptno
            end
否则,您将需要使用动态SQL和ref游标:

declare
   v_refcursor sys_refcursor;
   ...
begin
   open v_refcursor for   
     'select...
     order by ' || v_order_by;

如果这样做,请务必了解如何在动态SQL where子句中使用绑定变量而不是文字。

谢谢您的帮助。不幸的是,case语句似乎要求所有可能的值都是相同的类型。这对我不起作用,因为我有几个列需要像数字和其他需要排序的列我把所有的东西都改成了参考光标。再次感谢。你可以把字符串和数字一起排序,你只需要把数字转换成字符串,例如to_CHAR(mynum,'fm00000000')将把填充整数保留为零,这样在按字母顺序排序时就可以正确排序。