顯示具有 oracle d2k 標籤的文章。 顯示所有文章
顯示具有 oracle d2k 標籤的文章。 顯示所有文章

2012年1月11日 星期三

[轉]ORACLE FORM ZA 常用子程序

--获取系统记录行数
go_block('T_WARITEMPRT');
last_record;
row_count:=:system.trigger_record; --system.cursor_record
--execute_trigger('POST-CHANGE');
--设置鼠标状态
set_application_property(cursor_style,'BUSY');   忙碌状态
set_application_property(cursor_style,'DEFAULT'); 正常状态

2011年12月22日 星期四

[轉]oracle form使用commit

http://blog.csdn.net/cunxiyuan108/article/details/6027634
1.commit_form针对form上面的数据变动进行commit,对于代码中的类似update,insert语句也进行提交;
如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。
2.do_key('commit_form')会首先寻找form下的triggers中的KEY-COMMIT这个trigger,并执行KEY-COMMIT中所写的代码。
如果没有KEY-COMMIT这个trigger,则会针对form和代码一起提交。
如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。
3.commit对form和数据库进行提交.
如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。
4.forms_ddl('commit');只针对代码中的update,insert,delete语句进行提交,form上面的数据变动不提交。

2011年12月8日 星期四

[轉]oracle hint

在SQL語句優化過程中,我們經常會用到hint,現總結一下在SQL優化過程中常見Oracle HINT的用法:

1. /*+ALL_ROWS*/
表明對語句塊選擇基於開銷的優化方法,並獲得最佳吞吐量,使資源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/
表明對語句塊選擇基於開銷的優化方法,並獲得最佳響應時間,使資源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

3. /*+CHOOSE*/
表明如果數據字典中有訪問表的統計信息,將基於開銷的優化方法,並獲得最佳的吞吐量;
表明如果數據字典中沒有訪問表的統計信息,將基於規則開銷的優化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

4. /*+RULE*/
表明對語句塊選擇基於規則的優化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

5. /*+FULL(TABLE)*/
表明對錶選擇全局掃描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';

6. /*+ROWID(TABLE)*/
提示明確表明對指定表根據ROWID進行訪問.
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='SCOTT';

7. /*+CLUSTER(TABLE)*/
提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇對像有效.
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

8. /*+INDEX(TABLE INDEX_NAME)*/
表明對錶選擇索引的掃描方法.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';

9. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明對錶選擇索引升序的掃描方法.
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';

10. /*+INDEX_COMBINE*/
為指定表選擇位圖訪問路經,如果INDEX_COMBINE中沒有提供作為參數的索引,將選擇出位圖索引的布爾組合方式.
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
WHERE SAL<5000000 emp_no="SCOTT" sex="M" dpt_no="V.DPT_NO">V.AVG_SAL;

20. /*+NO_MERGE(TABLE)*/
對於有可合併的視圖不再合併.
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;

21. /*+ORDERED*/
根據表出現在FROM中的順序,ORDERED使ORACLE依此順序對其連接.
例如:
SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;

22. /*+USE_NL(TABLE)*/
將指定表與嵌套的連接的行源進行連接,並把指定表作為內部表.
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

23. /*+USE_MERGE(TABLE)*/
將指定的表與其他行源通過合併排序連接方式連接起來.
例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

24. /*+USE_HASH(TABLE)*/
將指定的表與其他行源通過哈希連接方式連接起來.
例如:
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;

25. /*+DRIVING_SITE(TABLE)*/
強制與ORACLE所選擇的位置不同的表進行查詢執行.
例如:
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;

26. /*+LEADING(TABLE)*/
將指定的表作為連接次序中的首表.

27. /*+CACHE(TABLE)*/
當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩衝區緩存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

28. /*+NOCACHE(TABLE)*/
當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩衝區緩存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;

29. /*+APPEND*/
直接插入到表的最後,可以提高速度.
insert /*+append*/ into test1 select * from test4 ;

30. /*+NOAPPEND*/
通過在插入語句生存期內停止並行模式來啟動常規插入.
insert /*+noappend*/ into test1 select * from test4 ;

2011年11月9日 星期三

d2k呼叫c#並傳送參數

http://www.dotblogs.com.tw/atowngit/archive/2009/12/26/12681.aspx
C#端

Program.cs
static class Program
    {
        ///


        /// 應用程式的主要進入點。
        ///

        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (args.Length == 0){
                Application.Run(new Form1());
            } else {
                Application.Run(new Form1(args));
            }
        }
    }

Form1.cs
public partial class Form1 : Form
    {
        private string _args;
        public Form1()
        {
            InitializeComponent();
        }
        public Form1(string value)
        {
            //if (!string.IsNullOrEmpty(value))
            //{
            //    _args = value;
            //}


            textBox1.Text = value[0].ToString();
            textBox2.Text = value[1].ToString();
        }
    }

ORACLE FORM端
PROCEDURE host_csharp IS
  v_path    varchar2(50);
v_command varchar2(200);
BEGIN
  v_path:='D:\VS2005\WindowsApplication2.exe ';
  v_command := v_path||:BLOCK3.ITEM5||''||:BLOCK3.ITEM6;
  
  --Host(v_command, NO_SCREEN);
  Host(v_command);
  
  IF NOT Form_Success THEN
    Message('Error -- Message not sent.');
  ELSE Message('Message Sent.');
  END IF;

END;

2011年9月1日 星期四

[轉]在Oracle Form中,如何实现自动编号(行号)的功能


在Oracle Form中,如何实现自动编号(行号)的功能

方法一、
只需要将序号定义成公式,并将公式设置为:get_block_property('block_name',current_record) 就可以实现了,或者把这行语句放到“When-Create-Record”触发器中。
缺点:增改删时,行号不能自动刷新。
方法二、
block的三个触发器中添加相应的代码:
Key-Crerec:
DECLARE
LINE NUMBER;
BEGIN
LINE := :SYSTEM.CURSOR_RECORD;
LOOP
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN 
EXIT; 
ELSE
NEXT_RECORD; 
:blk.ID := :SYSTEM.CURSOR_RECORD + 1; 
END IF; 
END LOOP;
GO_RECORD(LINE);
CREATE_RECORD;
:blk.ID := :SYSTEM.CURSOR_RECORD;
END;
Key - Delrec:
DECLARE
LINE NUMBER;
BEGIN
DELETE_RECORD;
LINE := :SYSTEM.CURSOR_RECORD;
LOOP 
:blk.ID := :SYSTEM.CURSOR_RECORD; 
IF :SYSTEM.LAST_RECORD = 'TRUE' THEN 
EXIT; 
ELSE 
NEXT_RECORD; 
END IF; 
END LOOP;
GO_RECORD(LINE);
END;
When - Create - Record:
:blk.ID := :SYSTEM.TRIGGER_RECORD;
缺点:对于记录数很少的table适用,当table中的记录很多时,由于使用了循环操作,所以会影响效率。

2011年8月23日 星期二

FORM 簡易開發流程(轉)


製作登入、資料登錄畫面,按鈕觸發:       
      When-Button-Pressed   
        要實現下面幾個功能。        1。保存功能      輸入資料以後,按此按鈕保存到對應變數裏。   
        2。消除功能      消除所有輸入,恢復到原始狀態   
        3。輸出功能      將此表輸出到C:\aaa   
        4。翻頁功能      pageup   翻到上個畫面,pagedown下個畫面。   
        5。數據登入      順序排列,比如輸入   D,B,C,A   登陸時候按照A,B,C,D   排列   
        6。條件判斷      比如A項必須填寫,否則彈出錯誤對話方塊;如果填寫B項,但是資料庫裏面沒有B,也彈出對話方塊。   
        7。可能出現的錯誤、問題和bug  

   第一步   當然是建表了   
  example   :   --   create   table     
  drop   table   t_tname;   
  create   table   t_tname(xh     number(2),                  --   序號   
           xm      varchar2(10),                            --   姓名   
           csrq     date,                                       --   出生日期   
           bz       varchar2(100),                           --   備註   
          constraint   pk_t_tname   primary   key(xh));  

  下面以表格   t_tname   為例   
    
  第二步   就是實現功能了   
  打開form   builder   前期準備工作   
  首先要有一個畫布、視窗(假如將其名字名為cc_main,w_main)兩者必須對應,然後就是添加資料塊(就是選擇你建立的表格)佈局畫面,按照提示一步一步完成了,最後將你需要實現什麼功能添加功能按鈕,放在另外一個非資料庫塊   
    
  然後就是代碼編寫了。   
  1.WHEN-NEW-FORM-INSTANCE(進入FROM時執行)   所要做的就是初始化視窗和一些自己需要的查詢   
      1.1   將初始化視窗寫成一個過程   
    
  PROCEDURE   Prc_Init_Windows   IS   
    
  BEGIN   
      Set_Window_Property(Forms_Mdi_Window,TITLE,'WINDOW_NAME');             --設置多文檔視窗標題   
      Set_Window_Property(Forms_Mdi_Window,WINDOW_STATE,maximize);           --設置多文檔視窗最大化   
      Set_Window_Property('W_Main',WINDOW_STATE,maximize);                        --設置主視窗最大化   
      :System.Message_Level:='15';                                                             --設置資訊提示級別   
  END;   
  然後直接調用過程在WHEN-NEW-FORM-INSTANCE觸發器裏   
  --   code     
  Prc_Init_Windows;   
  GO_BLOCK('t_tname');   
  SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_false);   
  SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);   
  execute_query;     --   內置副程式執行查詢(查詢所有記錄)   
    
  2.添加   (所要做的就是保證序號不能為空,關鍵字)   
  兩種操作方法一種直接在介面上輸入,二種彈出另外一個視窗進行操作   
  就講第一種吧,定義一個form參數p_xh   (在物件導航器裏面定義)   
  declare   
      nXH NUMBER(2);   
  BEGIN   
    
      GO_BLOCK('t_tname');   
      SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_TRUE);   
      SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);   
      last_record;   
      create_record;   
      select   max(xh)   into   nXH   from   t_tname;   
      :parameter.p_xh   :=   nXH;   
      :t_tname.xh   :=   :parameter.p_xh;   
    
  END;   
    
  t_tname資料塊中添加WHEN-NEW-RECORD-INSTANCE觸發器   
      if   get_block_property('t_tname',insert_allowed)   =   'true'   then   
          if   :t_tname.xh   is   null   then   
              :parameter.p_xh   :=   :parameter.p_xh   +   1;   
              :t_tname.xh   :=   :parameter.p_xh;   
          end   if;   
      end   if;   
    
  3.修改   
      GO_BLOCK('t_tname');   
      IF   :t_tname.XH   IS   NOT   NULL   THEN   
          SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);   
          SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_TRUE);   
      END   IF;   
    
  4.刪除   
        
      GO_BLOCK('t_tname');   
      IF   :t_tname.XH   IS   NOT   NULL   THEN   
          SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_true);   
          delete_record;   
          commit;   
          SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_false);   
      END   IF;   
    
  5.保存   
      GO_BLOCK('t_tname');   
      COMMIT;   
      SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_FALSE);   
      SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);   
      SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_FALSE);   
    
  6.撤銷   
  DECLARE   
      P_WHERE       VARCHAR2(200);   
  BEGIN   
      GO_BLOCK('t_tname');         
      CLEAR_BLOCK(NO_COMMIT);   
      P_WHERE   :=   GET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE);   
      SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);   
      EXECUTE_QUERY;   
  END;   
    
  7.查詢   
    
  以姓名和出生日期為欄位進行查詢,從新添加一個視窗和畫布,一個查詢非資料塊(例如塊名為BLK_QUERY)   
    
  DECLPARE   
      P_WHERE       VARCAHR2(200)   :=   '1=1';   
  BEGIN   
      IF   :BLK_QUERY.XM   IS   NOT   NULL   THEN   
          P_WHERE   :=   P_WHERE||'   AND   XM   =   '||CHR(39)||:BLK_QUERY.XM||CHR(39);   
      END   IF;   
      IF   :BLK_QUERY.CSRY   IS   NOT   NULL   THEN   
          P_WHERE   :=   P_WHERE||'   AND   TO_CHAR(CSRY,''YYYYMMDD'')   =           '||CHR(39)||TO_CHAR(:BLK_QUERY.CSRY,'YYYYMMDD')||CHR(39);   
      END   IF;   
    
      GO_BLOCK('t_tname');   
      CLEAR_BLOCK(NO_VALIDATE);   
      SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);   
      EXECUTE_QUERY;   
  END;