0
ORDER BY CASE
   WHEN v_SORT_TYPE = 'ASC' THEN
        CASE 
           WHEN v_SORT_ORDER = 'lname' THEN CAST(lname AS VARCHAR2(45)) || ',' || ROWNUM
           WHEN v_SORT_ORDER = 'code' THEN CAST(code AS VARCHAR2(52)) || ',' || ROWNUM
        END ASC
   WHEN v_SORT_TYPE = 'DSC' THEN
        CASE 
           WHEN v_SORT_ORDER = 'lname' THEN CAST(lname AS VARCHAR2(45)) || ',' || ROWNUM
           WHEN v_SORT_ORDER = 'code' THEN CAST(code AS VARCHAR2(52)) || ',' || ROWNUM
        END DESC                   
END                   

v_SORT_TYPE が ASC または DSC として渡される場合の条件を記述しようとしています。これでコンパイルエラーが発生します。

これは、私の pl/sql SP ではよくあることだと思います。

どこが間違っているのですか?

4

3 に答える 3

2

順序を複数の「列」に再考する必要があります。

ORDER BY
  CASE WHEN v_sort_type = 'ASC' AND v_sort_order = 'lname' THEN lname END ASC,
  CASE WHEN v_sort_type = 'DESC' AND v_sort_order = 'lname' THEN lname END DESC,
  CASE WHEN v_sort_type = 'ASC' AND v_sort_order = 'code' THEN cname END ASC,
  CASE WHEN v_sort_type = 'DESC' AND v_sort_order = 'code' THEN cname END DESC

一度に有効になるのはそのうちの1つだけなので、効果的に取得できます(たとえば)

 ORDER BY null ASC,null DESC,code ASC, null DESC

また

 ORDER BY null ASC,lname DESC,null ASC, null DESC
于 2010-07-24T07:04:14.397 に答える
1

切り貼りされた CASE() ステートメントに代わる方法は、動的 SQL を使用して進行中のクエリを形成することです。

これは可能な限り最も単純なデモです。

create or replace function get_emps
    ( p_dno in emp.deptno%type
      , p_sort_col in varchar2 := 'EMPNO'
      , p_asc_desc in varchar2 := 'ASC')
    return sys_refcursor
is
    stmt varchar2(32767);
    return_value sys_refcursor;
begin

    stmt := 'select * from emp where deptno = :1';

    if p_sort_col is not null 
    then 
        stmt := stmt ||' order by '||p_sort_col||' '||p_asc_desc;
    end if;

    open return_value for stmt using p_dno;

    return return_value;

end get_emps;
/

そして、これが実際の動作です...

SQL> var rc refcursor
SQL> exec :rc := get_emps(20, 'ENAME')

PL/SQL procedure successfully completed.

SQL> print rc

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 CLARKE     CLERK           7902 17-DEC-80        800                    20
      7902 GASPAROTTO ANALYST         7566 03-DEC-81       3000                    20
      7876 KULASH     CLERK           7788 23-MAY-87       1100                    20
      7788 RIGBY      ANALYST         7566 19-APR-87       3000                    20
      7566 ROBERTSON  MANAGER         7839 02-APR-81       2975                    20

SQL> exec :rc := get_emps(20, 'SAL', 'DESC')

PL/SQL procedure successfully completed.

SQL> print rc

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7788 RIGBY      ANALYST         7566 19-APR-87       3000                    20
      7902 GASPAROTTO ANALYST         7566 03-DEC-81       3000                    20
      7566 ROBERTSON  MANAGER         7839 02-APR-81       2975                    20
      7876 KULASH     CLERK           7788 23-MAY-87       1100                    20
      7369 CLARKE     CLERK           7902 17-DEC-80        800                    20

SQL>    
于 2010-07-24T08:07:50.207 に答える
0

ASC と DESC はキーワードです。CASE ステートメントは、キーワードではなく値として評価されます。1 つのオプションは動的 SQL (文字列を構築してから実行する) であり、別のオプションはより高いレベルで IF 句を使用することです。数字のみでソートする場合は、マイナス 1 を掛けることもできますが、文字列はより困難です。文字列と並べ替え順序を数値として格納する 2 つ目のテーブルを作成し、その数値に -1 を掛けるなど、おかしなことができると思いますが、最初の 2 つのオプションより考えられる方法でそれが優れているとは思えません。 .

于 2010-07-23T17:39:27.617 に答える