各位前辈,小弟新学oracle,现在要实现这样一个功能。比如有个person表,有这么几个字段,id、name、sex、address、age、.....我有一个存储过程,可以接收一个参数叫my_type.现在我要根据这个my_type,对不同的字段进行排序。select * from person (case my_type  when '2' then  name when '3' then  sex  end);上面这条语句可以执行,没有任何问题,就是当参数my_type为2时,则按照name排序,当参数为3时,按照sex排序。但现在实际的需求是要按两个字段来排序。就是当参数为2时,按照name和sex排序,当参数为3时,按照address和age排序。我写了如下的语句
select * from person (case my_type  when '2' then  name,sex when '3' then  address,age end);但是这条语句会报错,请教各位前辈,应该怎么修改呢?

解决方案 »

  1.   

    不行就用动态sql。
    tsql :=  'select dept_code from a03
               order by (case :arg when 2 then 1,2 when 3 then 3,4 end)';execute immediate tsql using arg;
      

  2.   

    貌似这样是不能使用case语句的。
    不过在存储过程里面可以这么写。
    declare
      type person_table_type is table of person%rowtype;
      person_table person_table_type;
      my_type varchar2(1) := '3';
      sqltxt varchar2(1000);
    begin
      sqltxt := 'select * from emp';
      if my_type='2' then
        sqltxt := sqltxt || ' order by name, sex;';
      elsif my_type='3' then
        sqltxt := sqltxt || ' order by address, age;';
      end if;
      dbms_output.put_line(sqltxt);
      execute immediate sqltxt bulk collect into person_table;
    end;
      

  3.   

    还有存储过程里面不能直接写select xxx from yyy语句的,
    必须
    select xxx into zzz from yyy
    select xxx bulk collect into into zzz from yyy
    类似这样的语句才行。