每次单击按钮 pl/sql 时如何按不同属性排序?

how to sort by different attribute each time we click a button pl/sql?

当我第一次单击该按钮时,我选择的列已排序。当我第二次点击时,它会按 reverse.How 排序,我可以这样做吗? 注意:我的程序由虚拟块组成。没有数据块

declare
  cursor c is
    select *
      from muhasebe.doviz_takip
     where UPPER(fatura_no) LIKE
           NVL('%' || UPPER(:giris.sorgulama) || '%', UPPER(fatura_no))
     order by fatura_no asc;
begin
  go_block('XDOVIZ_TAKIP');
  clear_block;
  first_record;

  for r in c loop  
    :FATURA_NO   := r.fatura_no;
    :ACIKLAMA    := r.aciklama;
    :YUKLEME_TAR := r.yukleme_tar;
    :VARIS_TAR   := r.varis_tar;
    :TUTAR       := r.tutar;  
    next_record;  
  end loop;

  first_record;
end;

这是我可以排序一次的代码

一个选项是创建一个全局变量(或参数)、两个游标(每个排序一个)和 IF-THEN-ELSE 根据全局变量的值决定使用哪个游标。

像这样:

DECLARE
   CURSOR c_asc IS
        SELECT *
          FROM muhasebe.doviz_takip
         WHERE UPPER (fatura_no) LIKE
                  NVL ('%' || UPPER ( :giris.sorgulama) || '%',
                       UPPER (fatura_no))
      ORDER BY fatura_no ASC;

   CURSOR c_desc IS
        SELECT *
          FROM muhasebe.doviz_takip
         WHERE UPPER (fatura_no) LIKE
                  NVL ('%' || UPPER ( :giris.sorgulama) || '%',
                       UPPER (fatura_no))
      ORDER BY fatura_no DESC;
BEGIN
   GO_BLOCK ('XDOVIZ_TAKIP');
   CLEAR_BLOCK;
   FIRST_RECORD;

   :global.sort := NVL ( :global.sort, 'ASC');

   IF :global.sort = 'DESC'
   THEN
      FOR r IN c_asc
      LOOP
         :FATURA_NO := r.fatura_no;
         :ACIKLAMA := r.aciklama;
         :YUKLEME_TAR := r.yukleme_tar;
         :VARIS_TAR := r.varis_tar;
         :TUTAR := r.tutar;

         NEXT_RECORD;
      END LOOP;

      :global.sort := 'ASC';
   ELSIF :global.sort = 'ASC'
   THEN
      FOR r IN c_desc
      LOOP
         :FATURA_NO := r.fatura_no;
         :ACIKLAMA := r.aciklama;
         :YUKLEME_TAR := r.yukleme_tar;
         :VARIS_TAR := r.varis_tar;
         :TUTAR := r.tutar;

         NEXT_RECORD;
      END LOOP;

      :global.sort := 'DESC';
   END IF;

   FIRST_RECORD;
END;

也许您可以尝试使其“更智能”(因为这几乎是虚拟的 - 或多或少地重复相同的代码两次),但是 - 这 简单 并且容易维护。

另一种方法是通过创建名为 v_doviz_takip 的视图将其转换为 数据库块 ,例如

CREATE OR REPLACE VIEW v_doviz_takip AS
SELECT *
  FROM muhasebe.doviz_takip

并将块xdoviz_takip查询数据源名称设置为此 并添加一个 WHERE 子句

UPPER(fatura_no) LIKE NVL('%' || UPPER(:giris.sorgulama) || '%', UPPER(fatura_no))`

到街区。然后添加一行

SET_BLOCK_PROPERTY('xdoviz_takip',order_by, 'fatura_no');

WHEN-NEW-FORM-INSTANCE 触发器。

并将您当前的代码块转换为这个:

DECLARE
  v_ord  VARCHAR2(25) := GET_BLOCK_PROPERTY('XDOVIZ_TAKIP',order_by);
BEGIN
  GO_BLOCK ('XDOVIZ_TAKIP');  
  CLEAR_BLOCK;
  IF v_ord = 'fatura_no' THEN v_ord := v_ord||' DESC'; ELSE v_ord := 'fatura_no' END IF;  
  SET_BLOCK_PROPERTY('XDOVIZ_TAKIP',order_by, v_ord);
  EXECUTE_QUERY;
  FIRST_RECORD;
END;

这样,它将按 fatura_no 降序排列 第一个 ,然后按升序排列 second 次尝试 , or 只是将当前的 IF 子句转换为 IF v_ord != 'fatura_no' ... 会反向改变行为。