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年10月28日 星期五

[轉自ptt]繪圖電腦菜單

作者: david429 () 看板: PC_Shopping
標題: [建議] 繪圖、剪輯、後製、3D繪圖、算圖機
時間: Tue Apr 12 18:48:46 2011

這算是小弟一直長久以來想發的文,之所以會發這篇文章,
是因為發現板上比較缺乏對於動畫與繪圖這方面詳細敘述且正確的菜單。
也曾經因此跟不少亂開菜單的板友戰文過。

尤其在看見神龍大也有電腦菜單這方面的需求時,
我不禁滴下了一滴眼淚,了解即使是神也是會有需求的。

便決定好好的寫一篇關於繪圖、3D動畫、算圖,多媒體相關菜單這方面的文章。

文章內容多經過研究與測試才有的結論,
若是有任何敘述不詳盡,不正確的地方,還請各位鄉民指教。

----------------------------------------------------------------------------
以下分為  繪圖、剪輯、後製、3D、算圖(運算) 等五大類電腦菜單機種去說明
----------------------------------------------------------------------------

1.基本繪圖機  PhotoShop  Illustrator

CPU: ★
此類型機種,CPU一般常態負荷量不會太吃緊,四核四執行續 就很夠用了。

記憶體: ★★

繪製大型圖檔、多圖層、或是多開檔案時非常吃記憶體。
在Windows中,當記憶體不夠用時,會將緩存暫存至硬碟上,
硬碟的讀寫與操作時間就是讓電腦運行變慢的主因,所以記憶體越大越好。
當然記憶體不是絕對必須,要看你所繪製的圖檔大小與圖層多寡。

硬碟: ★★

假如常常因為存檔讀檔花很多時間的話,建議可以加一顆SSD,
設為快取專用,與工作檔案儲存用。

顯示卡: ★

顯示卡部分其實中階低階款即可,單純繪圖的話,對這部分不要求。
---------------------------------------------------------------------------
2.剪輯專用機  Premiere  Vegas  Avid  Edius

CPU:  ★★

此類型機種,在輸出時常常會需要壓縮會需要到四核八執行續,或是六核、八核。
但是主要還是看硬碟的速度是否跟得上。

記憶體: ★★

在這些軟體中,有會將Preview的部分,Cache在記憶體中,
記憶體越大,可以Preview的長度越長,但不是絕對必須。

硬碟:  ★★★

大部分影片在輸出時,因為都會剪很多Layer,所以大都是卡在硬碟速度,
尤其是Full HD,隨隨便便就10幾G的檔案,非常吃硬碟。
且影像檔都很大,所以建議硬碟容量要大,速度要快。

可以分兩顆以上的磁碟?[1mA一顆儲存用,一顆放當前工作檔案用,
工作檔案用的那顆磁碟,速度越快越好,可以組 Raid 0,
或是裝SSD,存取速度對於輸出速度上有決定性的影響!

顯示卡:  ★

顯示卡部分其實中階低階款即可,單純剪輯的話,對這部分不要求。
個人建議是 Nvidia家的顯示卡,主要是 CUDA 的技術,
Adobe系列在壓縮輸出方面可以幫助不少,在此就不詳述了。
---------------------------------------------------------------------------
3.後製、動畫機  AfterEffects Nuke Combustion

CPU:  ★★★

此類型機種,在輸出時常常會需要壓縮會需要到四核八執行續,或是六核、八核。
但是主要還是看硬碟的速度是否跟得上。

記憶體:  ★★★

在AE中,Preview的部分,是直接Cache在記憶體中,
記憶體越大,可以Preview的長度越長,建議一定要裝到滿,這方面不能省。

硬碟: ★★

大部分影片在輸出時,因為都會剪很多Layer,所以大都是卡在硬碟速度,
且影像檔都很大,所以建議硬碟容量要大,速度要快。
可以分兩顆以上的磁碟,一顆儲存用,一顆放當前工作檔案用,
工作檔案用的那顆磁碟,速度越快越好,可以組 Raid 0,
或是裝 SSD存取速度對於輸出速度上有決定性的影響!

顯示卡: ★★

顯示卡部分其實中階款即可,單純AE的話,對這部分不要求,
不過AE會吃很多特效,依照外掛不同主要使用CUDA的技術與OPENGL,
顯示卡還是不宜買太差的。

還是老話一句,個人建議是 Nvidia家的顯示卡,

---------------------------------------------------------------------------
4.3D動畫、美術製作、室內設計繪圖機  3dsMax  Maya  Softimage

CPU: ★★★
算圖與操作指令時CPU有決定性的影響,多半的外掛與指令都還是只有支援單執行續,
算圖都有支援多核心算圖,建議執行續越多越好,四核八執行續,或是六核、八核。
以 i5 750(四核四執行續)比i7 860(四核八執行續)同時脈下,算圖效能比約1:1.5。

記憶體: ★★★

在3D中影響到操作上速度主要是  Shader > 貼圖量 > 動畫 > 物件量 > 面數

Shader是指Viewport下的光影顯示,由顯示卡運算,
Viewport時的貼圖顯示量與面數則是儲存在 "顯示卡的記憶體中",
動畫與物件量,則是儲存在電腦的記憶體中,

所以顯示卡越快,顯示記憶體越大,對於操作時的流暢度會有越大的幫助,
而記憶體越大,當物件量,與動畫越多時,越可以提共順暢的操作,
假如當動畫量大到超出記憶體,則會緩存在硬碟上,這時SSD就非常有幫助了。

硬碟:  ★

硬碟建議買越大越好,輸出的圖檔跟分層隨便便就超過100GB以上,
假如有用大量的粒子特效(Cache),會需要高速的硬碟與大量的硬碟空間,
建議有預算的話可買顆SSD當作工作碟來用。
假如只是純粹3D建模,硬碟普通就可以了。

顯示卡:  ★★★

別再相信那些亂開菜單的人,說做3D就要用專業繪圖卡的說法
除非你有確定使用的軟體,對於繪圖卡有全面性且必要性的支援,
不然買中高階遊戲卡就好,面數不高的話中階即可。

做3D一定要用繪圖卡,那已經是五六年前的事情了!
現在很多遊戲卡的效能已經遠遠超越相同價位的繪圖卡了。

顯示卡越快,顯示記憶體越大,對於操作時的流暢度會有越大的幫助,

顯示卡的話,一定要買 Nvidia家的。
對於3D方面,已經有很多決定性的功能,都只有Nvidia家才有完全支援。

首先,Max 2012、Maya 2012都有內建 MassFX (PhysX)
這是一個"即時物理模擬"的系統,Max 2011也有 PhysX 的 Beta 可以使用
這之中 Realtime 的物理模擬,與布料模擬。

即時的模擬會是動畫未來的需求與功能之一。

---------------------------------------------------------------------------
5.3D運算機  3dsMax  Maya  Softimage  Realflow  Houdini

CPU:  ★★★

運算時CPU有決定性的影響,算圖都有支援多核心算圖,
建議執行續越多越好,四核八執行續,或是六核、八核。

但還有許多運算方面,像是 Maya nCloth 或是 Max Hairfarm在模擬時
僅使用單一執行續,不過3D運算機還是越多核心越好。

以 i5 750(四核四執行續)比i7 860(四核八執行續)同時脈下,算圖效能比約1:1.5。

針對算圖而言,買專門的 RenderFarm 機型 是一個浪費錢的決定,
除了可以放在機櫃中,與微乎其微的穩定性差異外,沒有任何的好處,

算圖時CPU超頻,CPU頂多熱當外,是不會"算錯"的,一般錯誤的觀念,以為會算錯圖,
在穩定的超頻狀況下,超頻往往可以用更節省的成本,去達到更高的效益。
以 Intel i7 860 而言,大概可以穩定超頻達1.3倍的效能,當然還是看體質。

記憶體:  ★★

記憶體越大越好,算圖時,所有的貼圖都會預載到記憶體中,
模擬時的動畫,也會儲存到記憶體中。
當記憶體不夠時,就會吃到硬碟上,吃到硬碟上,算圖的效率就會大大降低。

硬碟:  ☆

硬碟影響不大,網路算圖時甚至不吃本機硬碟存取,除非貼圖量超過記憶體能負荷的量。

顯示卡:  ☆

要是不需要操作,單純做運算的話,可以使用內顯即可。
--------------------------------------------------------------------------

 比較圖表
┌────┬────┬────┬────┬────┬────┐
│        │  繪圖  │  剪輯  │  後製  │ 3D繪圖 │  算圖  │
├────┼────┼────┼────┼────┼────┤
│  CPU   │   ★   │  ★★  │ ★★★ │ ★★★ │ ★★★ │
├────┼────┼────┼────┼────┼────┤
│ 記憶體 │  ★★  │  ★★  │ ★★★ │ ★★★ │  ★★  │
├────┼────┼────┼────┼────┼────┤
│  硬碟  │  ★★  │ ★★★ │  ★★  │   ★   │   ☆   │
├────┼────┼────┼────┼────┼────┤
│ 顯示卡 │   ★   │   ★   │  ★★  │ ★★★ │   ☆   │
├────┼────┼────┼────┼────┼────┤
│建議預算│ $20000 │ $25000 │ $30000 │ $30000+│ $20000 │
└────┴────┴────┴────┴────┴────┘

總結:

本篇中並無詳細敘述菜單,主要是針對多媒體動畫這方面類型需求,
給有需要的人一點參考的空間,菜單的話由眾多的鄉民提供則是最好不過了

我做動畫將近六年了,目前在動畫公司,主要是撰寫外掛與解決效能方面的問題。
以上許多都是經過實際測試得到的結果 ,藉以給給裝機的人作為參考。

我並不是 Nvidia 的粉絲,以前也用Ati9200、9550、X800...
不過在 Nvidia 開始重視多媒體這塊市場後,他們寫了許多非常有幫助的系統與支援
因此才會大推 Nvidia。

以往物理模擬要花20個小時運算的東西,如今都Realtime了,等待的時間節省不少。

2011年10月12日 星期三

javasrcipt限制textbox內容為數字

1.body之間:


script language="javascript" type="text/javascript"

 function   NumberText()
  {
  if(!(((window.event.keyCode>=48)&&(window.event.keyCode<=57))||(window.event.keyCode==13)||(window.event.keyCode==46)||(window.event.keyCode==45)))
  {
        window.event.keyCode=0;
  }
  }

/script


2.textbox內

asp:TextBox ID="txtInputChtno" onkeypress="NumberText()"  runat="server"

3.aspx.cs後端程式碼 事件內(ex: PageLoad)
txtInputChtno.Attributes.Add("onkeypress", "NumberText()");

2011年10月4日 星期二

2011年9月29日 星期四

[轉]ORACLE DUAL表详解


ORACLE DUAL表详解

2008-05-06 04:22:01.0      来源:e800数据库频道         作者:
关键词:  数据库     ORACLE     rac     RAC     ORACLE   
看itpub上一个帖子:http://www.itpub.net/viewthread.php?tid=981212&extra=&page=1
想学习以下Oracle dual表。

Oracle Asktom 的解释:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1562813956388


下面来源: http://wzhcn.spaces.live.com/blog/cns!FBA7EF989C66522E!515.entry

1、DUAL表的用途
Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
--查看当前连接用户
SQL> select user from dual;
USER
------------------------------
SYSTEM
--查看当前日期、时间
SQL> select sysdate from dual;
SYSDATE
-----------
2007-1-24 1
SQL> select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;
TO_CHAR(SYSDATE,''YYYY-MM-DDHH2
------------------------------
2007-01-24 15:02:47
--当作计算器用
SQL> select 1+2 from dual;
1+2
----------
3
--查看序列值
SQL> create sequence aaa increment by 1 start with 1;
SQL> select aaa.nextval from dual;
NEXTVAL
----------
1
SQL> select aaa.currval from dual;
CURRVAL
----------
1

2、关于DUAL表的测试与分析
DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题。结果也因sql*plus、pl/sql dev等工具而异。
--查看DUAL是什么OBJECT
--DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.
SQL> select owner, object_name , object_type from dba_objects where object_name like ''%DUAL%'';
OWNER OBJECT_NAME OBJECT_TYPE
---------- ----------------- ------------------
SYS DUAL TABLE
PUBLIC DUAL SYNONYM

--查看表结构,只有一个字段DUMMY,为VARCHAR2(1)型
SQL> desc dual
Name Type Nullable Default Comments
----- ----------- -------- ------- --------
DUMMY VARCHAR2(1) Y

--DUAL表的结构:
create table SYS.DUAL
(
DUMMY VARCHAR2(1)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 16K
next 16K
minextents 1
maxextents 505
pctincrease 50
);

/*
很是困惑,ORACLE为什么要用VARCHAR(1)型,用CHAR(1)难道不好么?从这样的表结构来看,DUAL表设计的目的就是要尽可能的简单,以减少检索的开销。
还有,DUAL表是建立在SYSTEM表空间的,第一是因为DUAL表是SYS这个用户建的,本来默认的表空间就是SYSTEM;第二,把这个可能经常被查询的表和用户表分开来存放,对于系统性能的是有好处的。
有了创建了表、创建了同义词还是不够的。DUAL在SYS这个Schema下面,因此用别的用户登录是无法查询这个表的,因此还需要授权:
grant select on SYS.DUAL to PUBLIC with grant option;
将Select 权限授予公众。
接下来看看DUAL表中的数据,事实上,DUAL表中的数据和ORACLE数据库环境有着十分重要的关系(ORACLE不会为此瘫痪,但是不少存储过程以及一些查询将无法被正确执行)。
*/

--查询行数
--在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数
SQL> select count(*) from dual;
COUNT(*)
----------
1

SQL> select * from dual;
DUMMY
-----
X

--插入数据,再查询记录,只返回一行记录
SQL> insert into dual values (''Y'');
1 row created.
SQL> commit;
Commit complete.
SQL> insert into dual values (''X'');
1 row created.
SQL> insert into dual values (''Z'');
1 row created.
SQL> commit;
Commit complete.
SQL> select count(*) from dual;
COUNT(*)
----------
4
SQL> select * from dual;
DUMMY
-----
X

/*
--假我们插入一条数据,DUAL表不是返回一行,而是多行记录,那会是什么结果呢?
SQL> insert into dual values(''Y'');
1 行 已插入
SQL> commit;
提交完成
SQL> select * from dual;
DUMMY
-----
X
Y
SQL> select sysdate from dual;
SYSDATE
-----------
2004-12-15
2004-12-15

这个时候返回的是两条记录,这样同样会引起问题。在通过使用
select sysdate into v_sysdate from dual;
来获取时间或者其他信息的存储过程来说,ORACLE会抛出TOO_MANY_ROWS(ORA-01422)异常。
因此,需要保证在DUAL表内有且仅有一条记录。当然,也不能把DUAL表的UPDATE,INSERT,DELETE权限随意释放出去,这样对于系统是很危险的
*/

--把表截掉
SQL> truncate table dual;
Table truncated.
SQL> select count(*) from dual;
COUNT(*)
----------
0
SQL> select * from dual;
no rows selected
SQL> select sysdate from dual;
no rows selected

--试着把DUAL表中的数据删除,看看会出现什么结果:
SQL> delete from dual;
1 行 已删除
SQL> select * from dual;
DUMMY
-----
SQL> select sysdate from dual;
SYSDATE
-----------
/*
我们便取不到系统日期了。因为,sysdate是个函数,作用于每一个数据行。现在没有数据了,自然就不可能取出系统日期。
这个对于很多用
select sysdate into v_sysdate from dual;
这种方式取系统时间以及其他信息的存储过程来说是致命的,因为,ORACLE会马上抛出一个NO_DATA_FOUND(ORA-01403)的异常,即使异常被捕获,存储过程也将无法正确完成要求的动作。
*/

--对于DELETE操作来说,ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的
--不管表内有多少记录(没有记录除外),ORACLE对于每次DELETE操作都只删除了一条数据。
SQL> select count(*) from dual;
COUNT(*)
----------
2
SQL> delete from dual;
1 行 已删除
SQL> commit;
提交完成
SQL> select count(*) from dual;
COUNT(*)
----------
1

/*
附: ORACLE关于DUAL表不同寻常特性的解释
There is internalized code that makes this happen. Code checks that ensurethat a table scan of SYS.DUAL only returns one row. Svrmgrl behaviour is incorrect but this is now an obsolete product.
The base issue you should always remember and keep is: DUAL table should always have 1 ROW. Dual is a normal table with one dummy column of varchar2(1).
This is basically used from several applications as a pseudo table for getting results from a select statement that use functions like sysdate or other
prebuilt or application functions. If DUAL has no rows at all some applications (that use DUAL) may fail with NO_DATA_FOUND exception. If DUAL has more than 1 row then applications (that use DUAL) may fail with TOO_MANY_ROWS exception.
So DUAL should ALWAYS have 1 and only 1 row
*/

DUAL表可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。

3、如果DUAL表被“不幸”删除后的恢复:
用sys用户登陆。
创建DUAL表。
授予公众SELECT权限(SQL如上述,但不要给UPDATE,INSERT,DELETE权限)。
向DUAL表插入一条记录(仅此一条): insert into dual values(''X'');
提交修改。
--用sys用户登陆。
SQL> create pfile=’d:\pfile.bak’ from spfile
SQL> shutdown immediate
--在d:\pfile.bak文件中最后加入一条:replication_dependency_tracking = FALSE
--重新启动数据库:
SQL> startup pfile=’d:\pfile.bak’
SQL> create table “sys”.”DUAL”
( “DUMMY” varchar2(1) )
pctfree 10 pctused 4;
SQL> insert into dual values(‘X’);
SQL> commit;
SQL> Grant select on dual to Public;
授权成功。

SQL> select * from dual;
D
-
X

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL>

--OK, 下面就可以正常使用了。 

2011年9月28日 星期三

BACKGROUNDWORK

BACKGROUNDWORK REF
http://www.dotblogs.com.tw/yc421206/archive/2009/02/15/7174.aspx

2011年9月23日 星期五

[轉]C#-.NET計算運算時間


C#-.NET計算運算時間

進行研究、程式、演算法的開發時,
常常會需要計算運算時間,
.NET提供了不錯,且方便的類別工具(Stopwatch)來進行時間的計算。


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;