chenhg

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2012年11月 (2)
  • 2012年10月 (2)
  • 2012年9月 (6)

搜索

  •  

最新评论

  • 1. re: Java程序员情书
  • 有才!收藏了
  • --清泉..
  • 2. re: Java程序员情书
  • 太有才了你。
  • --www
  • 3. re: Java程序员情书[未登录]
  • that's great.
  • --kevin
  • 4. re: Java程序员情书
  • LZ很有才啊 佩服
  • --nightjar
  • 5. re: Java程序员情书
  • 很不错 有点意思
  • --itgg

阅读排行榜

  • 1. 做程序员工作好累啊(2290)
  • 2. js 异步加载 延迟执行 插件 (1644)
  • 3. Java程序员情书(1494)
  • 4. Oracle中DBMS_SQL的用法(1469)
  • 5. 关于JS异步加载的测试 (1431)

评论排行榜

  • 1. Java程序员情书(5)
  • 2. 做程序员工作好累啊(4)
  • 3. java 线程基础 学习 (0)
  • 4. PB数据窗口怎么根据内容显示(0)
  • 5. Oracle字符集乱码问题析及解决办法(0)

Powered by: 博客园
模板提供:沪江博客
BlogJava | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

2012年11月21日

Java程序员情书
我能抽象出整个世界...   但是我却不能抽象出你...   你肯定是一个单例,因为你是那样的独一无二...   所以我的世界并不完整...   我可以重载甚至覆盖这个世界里的任何一种方法...   但是却不能覆盖对你的思念... 也许命中注定了 你与我存在于不同的包里... 在你的世界里,你被烙上了私有的属性... 我用尽全身力气,也找不到访问你的接口... 我不愿就此甘心,找到了藏身在javaeye神殿的巫师,教会了我穿越时空的方法... 终于,我用反射这把利剑,打开了你空间的缺口... 并发现了接近你的秘密... 当我迫不及待地调用了爱你这个方法...   并义无返顾的把自己作为参数传进这个方法时...   我才发现爱上你是一个没有终止条件的递归...   它不停的返回我对你的思念并压入我心里的堆栈...   在这无尽的黑夜中 ,tb终于体验到你对我爱的回调... 我的内存里已经再也装不下别人... 当我以为将与你在这个死循环中天荒地老时... 万恶的系统抛出了爱的异常... 此刻我才发现,我不过是操纵于虚拟机下的一个线程,你也是... 但我毫不后悔,因为在爱的洗礼之后... 我看见了一个新的生命,那是我们的, 继承  
posted @ 2012-11-21 15:41 MR.CHEN 阅读(1494) | 评论 (5) | 编辑 收藏
 

2012年11月5日

java 线程基础 学习
线程是Java语言的一个部分,而且是Java的最强大的功能之一。究竟什么是线程,为什么要开发基于线程的应用程序?在本文中,我们将深入了解一下线程的用法,以及使用线程的一些技术。在我们开始讲述线程之前,最好先了解一下有关背景知识和分析一下线程的工作原理。

  当程序员一开始开发应用程序时,这些应用程序只能在一个时间内完成一件事情。应用程序从主程序开始执行,直到运行结束,像 Fortran/Cobol/Basic这些语言均是如此。

  随着时间的推移,计算机发展到可以在同一时间段内运行不止一个应用程序的时代了,但是应用程序运行时仍然是串行的,即从开始运行到结束,下一条指令接着上一条指令执行。到最近,程序发展到可以在执行时,以若干个线程的形式运行。Java就具有运行多线程的能力,可以在同一时间段内进行几个操作,这就意味着给定的操作不必等到另外一个操作结束之后,才能开始。而且对某个操作可以指定更高一级的优先级。

  不少程序语言,包括ADA, Modula-2和C/C++,已经可以提供对线程的支持。同这些语言相比,Java的特点是从最底层开始就对线程提供支持。除此以外,标准的Java类是可重入的,允许在一个给定的应用程序中由多个线程调用同一方法,tb而线程彼此之间又互不干扰。Java的这些特点为多线程应用程序的设计奠定了基础。

  什么是线程?

  究竟什么是线程呢?正如在图A中所示,一个线程是给定的指令的序列 (你所编写的代码),一个栈(在给定的方法中定义的变量),以及一些共享数据(类一级的变量)。线程也可以从全局类中访问静态数据。

#g_kclist{font-size:12px;width:570px;float:none; margin-top:5px; clear:right} #g_kclist a{color:#000; text-decoration:none} #g_kclist h2{margin:0px;padding:0px;font-size:14px; text-align:center;background:url(http://www.thea.cn/zt/zt_img/zczhongduan.gif) no-repeat;line-height:31px;color:#fff} #g_kclist table{line-height:25px;background:#B0DA90;margin-top:8px} #g_kclist table td{ text-align:center;background:#fff} #g_kclist table td.td1 a{color:#f00} #g_kclist table th{background:#F2F7ED;color:#525F46}
posted @ 2012-11-05 13:20 MR.CHEN 阅读(1210) | 评论 (0) | 编辑 收藏
 

2012年10月23日

PB数据窗口怎么根据内容显示
有多种方法的,我只说两种最简单的。

一、定义数据源sql时,定义一个变量:xb,然后数据源写成:

  select * from [运动员表] where [性别]=:xb

  再从窗口的open事件中写:

  dw_1.settransobject(sqlca)
  dw_1.retrieve('男')//把变量传给数据窗口,只刷出男生。

  即可实现。


二、定义数据源sql时,直接写成:

  select * from [运动员表]

  窗口的open事件中写:

  dw_1.settransobejct(sqlca)
  dw_1.retrieve()//这句是刷新出所有的运动员,包括男女
  dw_1.setfilter("[性别]='男'")//为数据窗口设置过滤
  dw_1.filter()//使用过滤字符串过滤数据

  也可以实现你所要求的。

是不是数据窗口的行高不够(这个会挡住每行数据的一点点),
还有可能是details的bandtb向下拖拖 多放点空间 (这个肯能挡住最下面的数据)
posted @ 2012-10-23 15:37 MR.CHEN 阅读(1343) | 评论 (0) | 编辑 收藏
 

2012年10月17日

Oracle字符集乱码问题析及解决办法
找到了问题产生的原因后,下面来讨论如何解决该问题。对于Oracle Enterprise Manager中的所有工具,有一个配置文件名为dbappscfg.properties,修改该文件即可解决上述问题。这个文件的位置在$ORACLE_HOME\sysman\config目录下,用任何的文本编辑器打开该文件,在这个文件里面,找到这样一项,

  # SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1

  去掉注释符#,同时将其修改为

  SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

  对于Windows操作系统,还需要修改一项,在文件中找到# SQLPLUS_SYSTEMROOT=c:\\WINNT40,去掉注释符,将其修改为你所在机器的操作系统主目录。如操作系统的主目录在D盘的Winnt下,则将其修改为

  SQLPLUS_SYSTEMROOT=d:\\WINNT。

  对于后面一项的修改只对Windows操作系统进行,对UNIX操作系统则不需要。如果在Windows操作系统中不修改该项,在Oracle Enterprise Manager中,连接系统时,会提示如下的错误:

  ORA-12560 TNS:protocol adapter error

  或者

  ORA-12545 Connect failed because target host or objectb does not exist

  修改完成后,保存文件,退出编辑。重新连接SQL PLUS Worksheet,字符集乱码问题得到解决,显示正确的简体中文字符集。

.item-area{width:578px;margin:15px auto;border-top:1px solid #ddd;color:#666} .item-area a,.item-area a:link,.item-area a:visited{color:#666;text-decoration:none} .item-area a:hover{color:#3a7ad9;text-decoration:underline;} a img{border:none;vertical-align:middle} .item-area h2,.item-area h3{float:none;font-size:100%;font-weight:normal;} .item-area .h2{height:25px;margin:10px 0;padding-left:35px;*float:left;font:bold 14px/25px "宋体";background:url(http://sns.thea.cn/module/images/icos.png) no-repeat 0 0} .item-area span.more{float:right;font:normal 12px/25px "宋体"} .item-area a.more{float:right;font:normal 12px/25px "宋体"} .item-a{margin-bottom:15px} .item-a .h-ksrm{background-position:0 0} .item-a li{*display:inline;overflow:hidden;zoom:1;line-height:2em;padding-left:35px;font-size:14px;background: url(http://sns.thea.cn/module/images/btns.png) no-repeat -1px -28px;} .item-a li a{float:left;} .item-a .testBtn{float:right;width:58px;height:21px;line-height:21px;font-size:12px;margin-top:5px;margin-top:3px;text-align:center;background:url(http://sns.thea.cn/module/images/btns.png) no-repeat -1px -1px; color:#FFFFFF;} .item-a a.freeBtn{width:20px;margin:0 0 0 6px;line-height:28px;color:#fff;font-size:12px;text-indent:-9999px;background: url(http://sns.thea.cn/module/images/icos.png) no-repeat 0 -131px;} .item-a li.hots a.freeBtn{background-position:0 -105px} .item-a a.examnum em{font-style:normal;color:red;font-weight:bold;} .item-b {padding:5px 0 20px;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd} .xsjl-list-col3s li{display:table-cell;*display:inline;zoom:1;vertical-align:top;width:182px;padding-right:10px;line-height:150%;font-size:12px;} .item-b .h-xsjl{background-position:0 -26px} .item-b .pic{float:left;margin:3px 10px 0 0;} .item-b em{font-style:normal;color:#dc2c2c} .item-b a.join{display:inline-block;padding-left:20px;background:url(http://sns.thea.cn/module/images/icos.png) no-repeat 0 -160px} .item-b .xsjl-list-col3s h3 a{display:inline-block;width:120px;overflow:hidden;white-space:nowrap;color:#3a7ad9} .item-b .xsjl-list-col3s h3{text-align:left;line-height:150%;font-family:"宋体","微软雅黑"}
posted @ 2012-10-17 17:06 MR.CHEN 阅读(1195) | 评论 (0) | 编辑 收藏
 

2012年9月21日

Oracle中DBMS_RANDOM包的用法
我的myoracle.txt脚本内容如下:
drop procedure PRO_RECEIPTSTOCK_5D19A;

create or replace procedure PRO_RECEIPTSTOCK_5D19A IS
v_STOCKID NUMBER(13);
v_STARTNO VARCHAR2(10);
v_ENDNO VARCHAR2(10);
v_RECEIPTTYPE NUMBER(13);
v_STATUS CHAR(1);
v_COUNT NUMBER(13);
v_UNITID NUMBER(13);
V_RELATEUSERNAME VARCHAR2(150);
V_GLIDENUM NUMBER(20);
V_FLAG VARCHAR2(2);
V_PROCTM DATE;
V_SPROCTM VARCHAR2(30);
V_REGISTERTM DATE;
V_SREGISTERTM VARCHAR2(30);
V_DBUSER VARCHAR2(20);

V_CURSQL VARCHAR2(4000);
V_MYCOUNT NUMBER;

CURSOR C_RECEIPTSTOCK_TMP IS
SELECT
STOCKID,
STARTNO,
ENDNO,
RECEIPTTYPE,
STATUS,
COUNT,
UNITID,
RELATEUSERNAME,
GLIDENUM,
FLAG,
PROCTM,
REGISTERTM,
DBUSER
FROM GFMIS_ALL.RECEIPTSTOCK_5D19A_TMP
WHERE
ZTOF_STATUS = '1'
AND DBUSER IS NOT NULL;
begin
  --把票据类型为5D的缴款书在库存中更新成一般缴款书
  UPDATE GFMIS_ALL.RECEIPTSTOCK T SET T.RECEIPTTYPE=4765 WHERE EXISTS (SELECT 1 FROM GFMIS_ALL.RECEIPTSTOCK_5D19A_TMP TT WHERE TT.STOCKID = substr(T.STOCKID, 4, length(TRIM(T.STOCKID))) AND TT.ZTOF_STATUS = '1' AND TT.RECEIPTTYPE=11533);

  OPEN C_RECEIPTSTOCK_TMP;
  LOOP
    FETCH C_RECEIPTSTOCK_TMP INTO v_STOCKID,
                               v_STARTNO,
                               v_ENDNO,
                               v_RECEIPTTYPE,
                               v_STATUS,
                               v_COUNT,
                               v_UNITID,
                               V_RELATEUSERNAME,
                               V_GLIDENUM,
                               V_FLAG,
                               V_PROCTM,
                               V_REGISTERTM,
                               V_DBUSER;

    EXIT WHEN C_RECEIPTSTOCK_TMP%NOTFOUND;

    V_CURSQL := 'SELECT COUNT(1) FROM ' || V_DBUSER || '.RECEIPTSTOCK WHERE STOCKID = ' || v_STOCKID;
    EXECUTE IMMEDIATE V_CURSQL INTO V_MYCOUNT;

    IF (V_MYCOUNT = 0) THEN
      
          V_SPROCTM :=TO_CHAR(V_PROCTM,'YYYY-MM-DD HH24:MI:SS');
          V_SREGISTERTM :=TO_CHAR(V_REGISTERTM,'YYYY-MM-DD HH24:MI:SS');
          IF (v_RECEIPTTYPE = 11533) THEN
             v_RECEIPTTYPE := 4765;
          END IF;
          
          V_CURSQL :='INSERT INTO ' || V_DBUSER || '.RECEIPTSTOCK (STOCKID,STARTNO,ENDNO,RECEIPTTYPE,STATUS,COUNT,UNITID,RELATEUSERNAME,GLIDENUM,FLAG,PROCTM,REGISTERTM) VALUES (' || v_STOCKID || ',''' || v_STARTNO || ''',''' || v_ENDNO || ''',' || v_RECEIPTTYPE || ',''' || v_STATUS || ''',' || v_COUNT || ',' || 1 || ',''' || V_RELATEUSERNAME || ''',' || NVL(V_GLIDENUM, 0) || ',''' || V_FLAG || ''', TO_DATE(''' || V_SPROCTM || ''',''YYYY-MM-DD HH24:MI:SS''), TO_DATE(''' || V_SREGISTERTM || ''',''YYYY-MM-DD HH24:MI:SS''))';
          EXECUTE IMMEDIATE V_CURSQL;

          UPDATE GFMIS_ALL.RECEIPTSTOCK_5D19A_TMP T SET T.ZTOF_STATUS = '0' WHERE T.STOCKID = v_STOCKID AND T.ZTOF_STATUS = '1';

          DELETE FROM GFMIS.RECEIPTSTOCK WHERE STOCKID = v_STOCKID;
      
    END IF;

  END LOOP;

  UPDATE GFMIS_ALL.RECEIPTSTOCK_5D19A_TMP T SET T.ZTOF_STATUS = '0' WHERE T.ZTOF_STATUS = '1' AND T.RECEIPTTYPE=11533;

  COMMIT;

  EXCEPTION
     WHEN NO_DATA_FOUND THEN
       NULL;
     WHEN OTHERS THEN
       CLOSE C_RECEIPTSTOCK_TMP;
         dbms_output.put_line(SQLERRM);
         IF C_RECEIPTSTOCK_TMP%ISOPEN THEN
            CLOSE C_RECEIPTSTOCK_TMP;
         END IF;
       RAISE;
end PRO_RECEIPTSTOCK_5D19A;
/

DROP TRIGGER TRI_RECEIPTSTOCK_CHG_AFT;

CREATE OR REPLACE TRIGGER TRI_RECEIPTSTOCK_CHG_AFT
AFTER DELETE OR INSERT OR UPDATE
ON RECEIPTSTOCK
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
curTable varchar2(50);
curType char(1);
curTime TimeStamp;
id number(13);
curID number(13);
curSQL varchar2(4000);
curUser varchar2(30);
v_distno varchar2(30);
v_dbuser varchar2(30);
v_mycount number(13);
BEGIN
   IF (INSERTING) THEN 
      --把票据类型为5DTB的缴款书在库存中更新成一般缴款书 或者 把指定的19个单位的库存移到分库里面
      SELECT COUNT(1) INTO v_mycount FROM GFMIS_ALL.RECEIPTSTOCK_DISTRICT T WHERE T.UNITID = :NEW.UNITID;
      IF (v_mycount > 0) THEN 
         SELECT T.DBUSER INTO v_dbuser FROM GFMIS_ALL.RECEIPTSTOCK_DISTRICT T WHERE T.UNITID = :NEW.UNITID;
         
         curSQL := 'SELECT COUNT(1) FROM ' || v_dbuser || '.RECEIPTSTOCK WHERE UNITID = ' || substr(:NEW.UNITID, 4, length(TRIM(:NEW.UNITID))) || ' AND RECEIPTTYPE = ' || :NEW.RECEIPTTYPE || ' AND STARTNO <= ''' || :NEW.STARTNO || ''' AND ENDNO >= ''' || :NEW.ENDNO || '';
         EXECUTE IMMEDIATE curSQL INTO v_mycount;
         if (v_mycount = 0) then
            INSERT INTO GFMIS_ALL.RECEIPTSTOCK_5D19A_TMP (STOCKID,STARTNO,ENDNO,RECEIPTTYPE,STATUS,COUNT,UNITID,RELATEUSERNAME,GLIDENUM,FLAG,PROCTM,REGISTERTM,DBUSER,ZTOF_STATUS) VALUES (substr(:NEW.STOCKID, 4, length(TRIM(:NEW.STOCKID))),:NEW.STARTNO,:NEW.ENDNO,:NEW.RECEIPTTYPE,:NEW.STATUS,:NEW.COUNT,substr(:NEW.UNITID, 4, length(TRIM(:NEW.UNITID))),:NEW.RELATEUSERNAME,:NEW.GLIDENUM,:NEW.FLAG,:NEW.PROCTM,:NEW.REGISTERTM,v_dbuser,'1');  
         end if;
         
          
      END IF;
      
      IF (:NEW.RECEIPTTYPE = 11533) THEN
        INSERT INTO GFMIS_ALL.RECEIPTSTOCK_5D19A_TMP (STOCKID,STARTNO,ENDNO,RECEIPTTYPE,STATUS,COUNT,UNITID,RELATEUSERNAME,GLIDENUM,FLAG,PROCTM,REGISTERTM,DBUSER,ZTOF_STATUS) VALUES (substr(:NEW.STOCKID, 4, length(TRIM(:NEW.STOCKID))),:NEW.STARTNO,:NEW.ENDNO,:NEW.RECEIPTTYPE,:NEW.STATUS,:NEW.COUNT,substr(:NEW.UNITID, 4, length(TRIM(:NEW.UNITID))),:NEW.RELATEUSERNAME,:NEW.GLIDENUM,:NEW.FLAG,:NEW.PROCTM,:NEW.REGISTERTM,NULL,'1');
      END IF;
    END IF;
   
    select seq_exchange_temp.nextval into id from dual;
    curUser :=lower(SYS_CONTEXT('userenv', 'session_user'));
    if (curUser != 'all_exchange_user') then
        SELECT CURRENT_TIMESTAMP INTO curTime FROM DUAL;
        curTable := 'RECEIPTSTOCK';
        if (deleting) then
            v_distno:=substr(:OLD.STOCKID,2,2);
            select dbuser into v_dbuser from GFMIS_ALL.DISTRICT where distno=v_distno;
            curType := '3';
            curID := :OLD.stockid;
    if (curUser = 'gfmis_all') then
            curSQL := 'SP_EX_RECEIPTSTOCK_DEL(''' || :OLD.STOCKID || ''')';
    else
            curSQL := 'SP_EX_RECEIPTSTOCK_DEL(''' ||  substr(:OLD.STOCKID,4) || ''')';
    end if;
        end if;
        if (updating) then
            v_distno:=substr(:OLD.STOCKID,2,2);
            select dbuser into v_dbuser from GFMIS_ALL.DISTRICT where distno=v_distno;
            curType := '2';
            curID := :OLD.stockid;
    if (curUser = 'gfmis_all') then
            curSQL := 'SP_EX_RECEIPTSTOCK_UPD(''' || :OLD.STOCKID || ''', ''' || :NEW.COUNT || ''', ''' || FN_FMT_SQL(:NEW.ENDNO) || ''', ''' || FN_FMT_SQL(:NEW.FLAG) || ''', ''' || :NEW.GLIDENUM || ''', ''' || TO_CHAR(:NEW.PROCTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || :NEW.RECEIPTTYPE || ''', ''' || TO_CHAR(:NEW.REGISTERTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || FN_FMT_SQL(:NEW.RELATEUSERNAME) || ''', ''' || FN_FMT_SQL(:NEW.STARTNO) || ''', ''' || FN_FMT_SQL(:NEW.STATUS) || ''', ''' || :NEW.STOCKID || ''', ''' || :NEW.UNITID ||  ''')';
    else
            curSQL := 'SP_EX_RECEIPTSTOCK_UPD(''' ||  substr(:OLD.STOCKID,4) || ''', ''' || :NEW.COUNT || ''', ''' || FN_FMT_SQL(:NEW.ENDNO) || ''', ''' || FN_FMT_SQL(:NEW.FLAG) || ''', ''' || :NEW.GLIDENUM || ''', ''' || TO_CHAR(:NEW.PROCTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || :NEW.RECEIPTTYPE || ''', ''' || TO_CHAR(:NEW.REGISTERTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || FN_FMT_SQL(:NEW.RELATEUSERNAME) || ''', ''' || FN_FMT_SQL(:NEW.STARTNO) || ''', ''' || FN_FMT_SQL(:NEW.STATUS) || ''', ''' ||  substr(:NEW.STOCKID ,4) || ''', ''' ||  substr(:NEW.UNITID ,4) ||  ''')';
    end if;
        end if;
        if (inserting) then
            v_distno:=substr(:NEW.STOCKID,2,2);
            select dbuser into v_dbuser from GFMIS_ALL.DISTRICT where distno=v_distno;
            curType := '1';
        curID := :NEW.stockid;
    if (curUser = 'gfmis_all') then
            curSQL := 'SP_EX_RECEIPTSTOCK_INS(''' || :NEW.COUNT || ''', ''' || FN_FMT_SQL(:NEW.ENDNO) || ''', ''' || FN_FMT_SQL(:NEW.FLAG) || ''', ''' || :NEW.GLIDENUM || ''', ''' || TO_CHAR(:NEW.PROCTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || :NEW.RECEIPTTYPE || ''', ''' || TO_CHAR(:NEW.REGISTERTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || FN_FMT_SQL(:NEW.RELATEUSERNAME) || ''', ''' || FN_FMT_SQL(:NEW.STARTNO) || ''', ''' || FN_FMT_SQL(:NEW.STATUS) || ''', ''' || :NEW.STOCKID || ''', ''' || :NEW.UNITID ||  ''')';
    else
            curSQL := 'SP_EX_RECEIPTSTOCK_INS(''' || :NEW.COUNT || ''', ''' || FN_FMT_SQL(:NEW.ENDNO) || ''', ''' || FN_FMT_SQL(:NEW.FLAG) || ''', ''' || :NEW.GLIDENUM || ''', ''' || TO_CHAR(:NEW.PROCTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || :NEW.RECEIPTTYPE || ''', ''' || TO_CHAR(:NEW.REGISTERTM,'YYYY-MM-DD HH24:MI:SS') || ''', ''' || FN_FMT_SQL(:NEW.RELATEUSERNAME) || ''', ''' || FN_FMT_SQL(:NEW.STARTNO) || ''', ''' || FN_FMT_SQL(:NEW.STATUS) || ''', ''' ||  substr(:NEW.STOCKID ,4) || ''', ''' ||  substr(:NEW.UNITID ,4) ||  ''')';
    end if;
        end if;

    if (curUser = 'gfmis_all') then
        INSERT INTO exchange_temp (ID,SEQID, TABLENAME, GENSQL, TYPE, DT, STATUS,ZKSTATUS,DBUSER)
        VALUES (id, curID,curTable, curSQL, curType, curTime, '2','1',v_dbuser );
    else
        INSERT INTO exchange_temp (ID,SEQID, TABLENAME, GENSQL, TYPE, DT, STATUS,ZKSTATUS,DBUSER)
        VALUES (id, curID,curTable, curSQL, curType, curTime, '2','0',v_dbuser );
    end if;
    end if;

    EXCEPTION
        WHEN OTHERS THEN
            RAISE;
end TRI_RECEIPTSTOCK_CHG_AFT;
/

commit;

【注】:在每一个DROP语句后面不能加/,而在创建PROCEDURE和TRIGGER的之后必须加/符号,否则下面的脚本会
        执行失败的。
        执行txt和sql的脚本写法如下:
        SQL> @D:\myoracle.txt;
 
        Procedure dropped
 
        Procedure created
 
        Trigger dropped
 
        Trigger created
 
        Commit complete
 
        SQL>
exec后面执行跟存储过程名或函数名[exec只能在命令行执行,call可以在任何环境下执行]。
posted @ 2012-09-21 13:09 MR.CHEN 阅读(219) | 评论 (0) | 编辑 收藏
 
Oracle中DBMS_RANDOM包的用法

1.dbms_random.value方法

dbms_random是一个可以生成随机数值或者字符串的程序包。这个包有initialize()、seed()、terminate()、value()、normal()、random()、string()等几个函数,但value()是最常用的,value()的用法一般有两个种,第一 
function value return number; 
这种用法没有参数,会返回一个具有38位精度的数值,范围从0.0到1.0,但不包括1.0,如下示例: 
SQL> set serverout on 
SQL> begin 
   2    for i in 1..10 loop 
   3      dbms_output.put_line(round(dbms_random.value*100)); 
   4    end loop; 
   5  end; 
   6  / 
46 
19 
45 
37 
33 
57 
61 
20 
82 
8 
  
PL/SQL 过程已成功完成。 
  
SQL>  
  
第二种value带有两个参数,第一个指下限,第二个指上限,将会生成下限到上限之间的数字,但不包含上限,“学无止境”兄说的就是第二种,如下: 
SQL> begin 
   2    for i in 1..10 loop 
   3      dbms_output.put_line(trunc(dbms_random.value(1,101))); 
   4    end loop; 
   5  end; 
   6  / 
97 
77 
13 
86 
68 
16 
55 
36 
54 
46 
  
PL/SQL 过程已成功完成。 

 

2. dbms_random.string 方法

某些用户管理程序可能需要为用户创建随机的密码。使用10G下的dbms_random.string 可以实现这样的功能。

例如:
SQL> select dbms_random.string('P',8 ) from dual ;
 
DBMS_RANDOM.STRING('P',8)
--------------------------------------------------------------------------------
3q<M"yf[
 
第一个参数的含义:
■ 'u', 'U' - returning string in uppercase alpha characters
■ 'l', 'L' - returning string in lowercase alpha characters
■ 'a', 'A' - returning string in mixed case alpha characters
■ 'x', 'X' - returning string in uppercase alpha-numeric
characters
■ 'p', 'P' - returning string in any printable characters.
Otherwise the returning string is in uppercase alpha
characters.
P 表示 printable,即字符串由任意可打印字符构成
而第二个参数表示返回的字符串长度。
3. dbms_random.random 方法
    random返回的是BINARY_INTEGER类型值,产生一个任意大小的随机数
  与dbms_random.value 的区别举例:
   Order By dbms_random.value;
这条语句功能是实现记录的随机排序
另外:
dbms_random.value 和
dbms_random.random 两者之间有什么区别?
1。Order By dbms_random.value ,为结果集的每一行计算一个随机数,dbms_random.value 是结果集的一个列(虽然这个列并不在select list 中),然后根据该列排序,得到的顺序自然就是随机的啦。
2。看看desc信息便知道vlue和random这两个函数的区别了,value返回的是number类型,tb并且返回的值介于1和0之间,而random返回的是BINARY_INTEGER类型(以二进制形式存储的数字,据说运算的效率高于number但我没测试过,但取值范围肯定小于number,具体限制得查资料了)
如果你要实现随机排序,还是用value函数吧

 

4. dbms_random.normal方法

NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。

5. dbms_random.send方法  

用于生成一个随机数种子,设置种子的目的是可以重复生成随机数,用于调试。否则每次不同,难以调度。

posted @ 2012-09-21 13:08 MR.CHEN 阅读(1194) | 评论 (0) | 编辑 收藏
 
Oracle中DBMS_SQL的用法
对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤:
open   cursor---> parse---> define   column---> excute---> fetch   rows---> close   cursor;
而对于dml操作(insert,update)则需要进行以下几个步骤:
open   cursor---> parse---> bind   variable---> execute---> close   cursor;
对于delete操作只需要进行以下几个步骤:
open   cursor---> parse---> execute---> close   cursor;

例一:
create table test(n_id   number,  v_name  varchar2(50), d_insert_date date);
alter table test add constraint pk_id  primary key(n_id);

declare
   v_cursor   number;
   v_sql      varchar2(200);
   v_id       number;
   v_name     varchar2(50);
   v_date     date;
   v_stat     number;
begin
  
   v_id := 1;
   v_name := '测试 insert';
   v_date := sysdate;
   v_cursor := dbms_sql.open_cursor;  --打开游标
   v_sql := 'insert into test(n_id, v_name, d_insert_date) values(:v_id,:v_name,:v_date)';
   dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);  --解析SQL
   dbms_sql.bind_variable(v_cursor, ':v_id', v_id);   --绑定变量
   dbms_sql.bind_variable(v_cursor, ':v_name', v_name);
   dbms_sql.bind_variable(v_cursor, ':v_date', v_date);
  
   v_stat := dbms_sql.execute(v_cursor);  --执行
   dbms_sql.close_cursor(v_cursor);   --关闭游标
   commit;
end;

例二:

declare
   v_cursor   number;
   v_sql      varchar2(200);
   v_id       number;
   v_name     varchar2(50);
   v_stat     number;
begin
    v_name := '测试 update';
    v_id := 1;
    v_cursor := dbms_sql.open_cursor;
    v_sql := 'update test set v_name = :v_name, d_insert_date = :v_date where n_id = :v_id';
    dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
    dbms_sql.bind_variable(v_cursor, ':v_name', v_name);
    dbms_sql.bind_variable(v_cursor, ':v_date', sysdate);
    dbms_sql.bind_variable(v_cursor, ':v_id', v_id);
    v_stat := dbms_sql.execute(v_cursor);
    dbms_sql.close_cursor(v_cursor);
    commit;
end;

例三:

declare
    v_cursor   number;
    v_sql      varchar2(200);
    v_id       number;
    v_stat     number;
begin

   v_id := 1;
   v_sql := 'delete from test where n_id = :v_id';
   v_cursor := dbms_sql.open_cursor;
   dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
   dbms_sql.bind_variable(v_cursor, ':v_id', v_id);
   v_stat := dbms_sql.execute(v_cursor);
   dbms_sql.close_cursor(v_cursor);
   commit;
end;

例四:

declare
   v_cursor    number;
   v_sql       varchar2(200);
   v_id        number;
   v_name      varchar2(50);
   v_date      varchar2(10);
   v_stat      number;
begin

    v_sql := 'select n_id, v_name, to_char(d_insert_date, ''yyyy-mm-dd'') from test';
    v_cursor := dbms_sql.open_cursor;              --打开游标
    dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);  --解析游标
    dbms_sql.define_column(v_cursor, 1, v_id);         --定义列
    dbms_sql.define_column(v_cursor, 2, v_name, 50);   --注意:当变量为varchar2类型时,要加长度
    dbms_sql.define_column(v_cursor, 3, v_date, 10);
    v_stat := dbms_sql.execute(v_cursor);        --执行SQL
    loop
        exit when dbms_sql.fetch_rows(v_cursor) <= 0;  --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
        dbms_sql.column_value(v_cursor, 1, v_id);   --将当前行的查询结果写入上面定义的列中。
        dbms_sql.column_value(v_cursor, 2, v_name);
        dbms_sql.column_value(v_cursor, 3, v_date);
        dbms_output.put_line(v_id || ':' || v_name || ':' || v_date);
    end loop;
end;

--------------------------------------------------------------------------------------------------
PL/SQL中使用动态SQL编程

    在PL/SQL程序设计过程中,会遇到很多必须使用动态sql的地方,oracle系统所tb提供的DMBS_SQL包可以帮助你解决问题。
(一)介绍

    DBMS_SQL系统包提供了很多函数及过程,现在简要阐述其中使用频率较高的几种:

    function open_cursor:打开一个动态游标,并返回一个整型;

    procedure close_cursor(c in out integer)
 :关闭一个动态游标,参数为open_cursor所打开的游标;

    procedure parse(c in integer, statement in varchar2, language_flag in integer):对动态游标所提供的sql语句进行解析,参数C表示游标,statement为sql语句,language-flag为解析sql语句所用oracle版本,一般有V6,V7跟native(在不明白所连database版本时,使用native);

    procedure define_column(c in integer, position in integer, column any datatype, [column_size in integer]):定义动态游标所能得到的对应值,其中c为动态游标,positon为对应动态sql中的位置(从1开始),column为该值所对应的变量,可以为任何类型,column_size只有在column为定义长度的类型中使用如VARCHAR2,CHAR等(该过程有很多种情况,此处只对一般使用到的类型进行表述);

    function execute(c in integer):执行游标,并返回处理一个整型,代表处理结果(对insert,delete,update才有意义,而对select语句而言可以忽略);

    function fetch_rows(c in integer):对游标进行循环取数据,并返回一个整数,为0时表示已经取到游标末端;

    procedure column_value(c in integer, position in integer, value):将所取得的游标数据赋值到相应的变量,c为游标,position为位置,value则为对应的变量;

    procedure bind_variable(c in integer, name in varchar2, value):定义动态sql语句(DML)中所对应字段的值,c为游标,name为字段名称,value为字段的值;

    以上是在程序中经常使用到的几个函数及过程,其他函数及过程请参照oracle所提供定义语句dbmssql.sql

(二)一般过程

    对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤:
    open cursor--->parse--->define column--->excute--->fetch rows--->close cursor;
    而对于dml操作(insert,update)则需要进行以下几个步骤:
    open cursor--->parse--->bind variable--->execute--->close cursor;
    对于delete操作只需要进行以下几个步骤:
    open cursor--->parse--->execute--->close cursor;

(三)具体案例

    下面就本人所开发系统中某一程序做分析
    该过程为一股票技术曲线计算程序,将数据从即时数据表中取出,并按照计算曲线的公式,tb对这些数据进行计算,并将结果保存到技术曲线表中.
--**********************************
--procedure name:R_Ma_Main
--入口参数:PID股票代码,PEND时间,pinterval时间间隔,totab目标数据表
--调用函数:R_GetSql1,R_GetSql2
--功能:具体计算单支股票ma技术曲线
--时间:2001-06-20
--**********************************
create or replace procedure R_Ma_Main
  (
   pid varchar2,
   pend varchar2,
   pinterval varchar2,
   totab varchar2
  ) is                      
  
--定义数组
type Date_type is table of varchar2(12) index by binary_integer;
type Index_type is table of number index by binary_integer;

TempDate Date_Type;--时间数组
TempIndex Index_Type;--股票收盘价数组
TempMa Index_Type;--ma技术曲线数据

cursor1 integer;--游标
cursor2 integer;--游标
rows_processed integer;--执行游标返回

TempInter integer;--参与计算数值个数
TempVal integer;--计算时间类型
TempSql varchar2(500);--动态sql语句
MyTime varchar2(12);--时间
MyIndex number;--数值
MidIndex number;--中间变量
i integer := 999;
j integer;
begin
  TempInter := to_number(substr(pinterval,1,4));
  TempVal := to_number(substr(pinterval,5,2));
  TempSql := R_GetSql1(pid, pend, TempVal);--得到选择数据的sql语句

  --得到当天的即时数据,并依次保存到数组中
  cursor1 := dbms_sql.open_cursor;  --创建游标
  dbms_sql.parse(cursor1, TempSql, dbms_sql.native);  --解析动态sql语句,取两个字段,时间及价格,其中时间以14位的varchar2表示
  dbms_sql.define_column(cursor1, 1, MyTime, 12);  --分别定义sql语句中各字段所对应变量
  dbms_sql.define_column(cursor1, 2, MyIndex);
  rows_processed := dbms_sql.execute(cursor1);
  loop
    if dbms_sql.fetch_rows(cursor1) > 0 then
      begin
        dbms_sql.column_value(cursor1, 1, MyTime);
        dbms_sql.column_value(cursor1, 2, MyIndex);
        TempDate(i) := MyTime;
        TempIndex(i) := MyIndex;
        i := i - 1;--按倒序的方法填入数组
      end;
    else
      exit;
    end if;
  end loop;
  dbms_sql.close_cursor(cursor1);
  
  --如果取得的数据量不够计算个数,则跳出程序
  if i > 999-TempInter then
    goto JumpLess;
  end if;
  
  --初始化中间变量
  MidIndex := 0;
  TempIndex(i) := 0;
  for j in i..i+TempInter-1 loop
    MidIndex := MidIndex + TempIndex(j);
  end loop; 

  --依次对当天数据计算ma值,并保存到ma数组中
  for j in i+TempInter..999 loop
    MidIndex := MidIndex - TempIndex(j-TempInter) + TempIndex(j);
    TempMa(j) := MidIndex/TempInter;
  end loop;   

  if TempVal < 6 then--如果计算的是分钟跟天的ma技术曲线
    begin
    cursor2 := dbms_sql.open_cursor;
    TempSql := 'insert into ' || totab || ' values(:r_no, :i_interval, :i_time, :i_index)';
    dbms_sql.parse(cursor2, TempSql, dbms_sql.native); 
    for j in i+TempInter..999 loop
      dbms_sql.bind_variable(cursor2, 'r_no', pid);
      dbms_sql.bind_variable(cursor2, 'i_interval', pinterval);
      dbms_sql.bind_variable(cursor2, 'i_time', TempDate(j));
      dbms_sql.bind_variable(cursor2, 'i_index', TempMa(j));
      rows_processed := dbms_sql.execute(cursor2);--插入数据
    end loop;
    end;
  end if; 
  commit;
  dbms_sql.close_cursor(cursor2);
  --数据量不足跳出
  <<JumpLess>>
  null;
  
  --exception处理,无关本话题
end;
/

(四)个人观点

    在使用dbms_sql系统包的过程中,其方法简单而又不失灵活,但还是需要注意一些问题:
    1、在整个程序的设计过程中,对游标的操作切不可有省略的部分,一旦省略其中某一步骤,则会程序编译过程既告失败,如在程序结尾处未对改游标进行关闭操作,则在再次调用过程时会出现错误.
    2、dbms_sql除了可以做一般的select,insert,update,delete等静态的sql做能在过程中所做工作外,还能执行create等DDL操作,不过在执行该类操作时应首先显式赋予执行用户相应的系统权限,比如create table等.该类操作只需open cursor--->prase--->close cursor即能完成.

    以上为本人在工作中对dbms_sql的一点点看法,不到之处,请予指正.
    对于想更深了解dbms_sql的朋友,请阅读dbmssql.sql文件.
 
 
附个Oracle自带的流程说明(强大啊):
 
  --  The flow of procedure calls will typically look like this:
  --
  --                      -----------
  --                    | open_cursor |
  --                      -----------
  --                           |
  --                           |
  --                           v
  --                         -----
  --          ------------>| parse |
  --         |               -----
  --         |                 |
  --         |                 |---------
  --         |                 v         |
  --         |           --------------  |
  --         |-------->| bind_variable | |
  --         |     ^     -------------   |
  --         |     |           |         |
  --         |      -----------|         |
  --         |                 |<--------
  --         |                 v
  --         |               query?---------- yes ---------
  --         |                 |                           |
  --         |                no                           |
  --         |                 |                           |
  --         |                 v                           v
  --         |              -------                  -------------
  --         |----------->| execute |            ->| define_column |
  --         |              -------             |    -------------
  --         |                 |------------    |          |
  --         |                 |            |    ----------|
  --         |                 v            |              v
  --         |           --------------     |           -------
  --         |       ->| variable_value |   |  ------>| execute |
  --         |      |    --------------     | |         -------
  --         |      |          |            | |            |
  --         |       ----------|            | |            |
  --         |                 |            | |            v
  --         |                 |            | |        ----------
  --         |                 |<-----------  |----->| fetch_rows |
  --         |                 |              |        ----------
  --         |                 |              |            |
  --         |                 |              |            v
  --         |                 |              |    --------------------
  --         |                 |              |  | column_value         |
  --         |                 |              |  | variable_value       |
  --         |                 |              |    ---------------------
  --         |                 |              |            |
  --         |                 |<--------------------------
  --         |                 |
  --          -----------------|
  --                           |
  --                           v
  --                      ------------
  --                    | close_cursor |
  --                      ------------ 
  --
  ---------------
posted @ 2012-09-21 13:07 MR.CHEN 阅读(1469) | 评论 (0) | 编辑 收藏
 

2012年9月18日

js 异步加载 延迟执行 插件

最近因工作的需要主要做web前段的优化,其中之一就是js的优化,在项目中的js代码相对比较规范的,都是$(function(){})这种格式。但是大家都知道js的下载比较耗时的,它的解析和执行是阻塞式的。我们是否可以先让js下载下来,在windows的load事件中在去解析和执行了。答案是肯定的,其中ControlJS .js就实现了这种方式。个人觉得它比LAB的延迟加载要优秀的一点,减少了js的加载时间。但是该js功能相对比较强大,同时也没有解决js依赖关系的加载。个人自己写了一个小插件 来实现js异步加载延迟执行。


代码如下:

 

[javascript]
(function () { 
    var document = window.document; 
    var getAttribute = function (elem, name) { 
        var attrs = elem.attributes; 
        var len = attrs.length; 
        for (var i = 0; i < len; i++) { 
            var attr = attrs[i]; 
            if (name === attr.nodeName) { 
                return attr.nodeValue; 
            } 
        } 
 
        return undefined; 
    }; 
 
    var scriptstbData; 
    var orders = []; 
    var findScripts = function () { 
        var aScripts = document.getElementsByTagName('script'); 
        var len = aScripts.length; 
        var scriptsArr = []; 
        var scriptsSrc = []; 
 
        for (var i = 0; i < len; i++) { 
            var script = aScripts[i]; 
            if ("text/asynjs" === getAttribute(script, "type") && "undefined" === typeof (script.founded)) { 
                script.founded = true; 
                var order = getAttribute(script, "order") || getAttribute(script, "data-order") || 0; 
                script.order = order; 
                if (orders.indexOf(order) < 0) { 
                    orders.push(order); 
                } 
                var src = getAttribute(script, "asynsrc") || getAttribute(script, "data-asynsrc"); 
                script.src = src; 
                if (src && scriptsSrc.indexOf(src) < 0) { 
                    scriptsArr.push(script); 
                } 
            } 
 
        } 
        orders.sort(function compare(a, b) { return a - b; }); 
        return scriptsData = scriptsArr; 
    }; 
    var downloadScripts = function (scriptArr) { 
        var scripts = scriptArr || findScripts(); 
        var len = scripts.length; 
 
        for (var i = 0; i < len; i++) { 
            var img = new Image(); 
            img.src = scripts[i].src; 
            img.style.display = "none"; 
        } 
    }; 
 
    var processScripts = function (scriptArr) { 
        var scripts = (scriptArr && scriptArr.constructor === Array) ? scriptArr : scriptsData; 
        var len = scripts.length; 
        var failscripts = []; 
        var wdata = []; 
        for (var i = orders.length - 1; i >= 0; i--) { 
            var order = orders[i]; 
            var urls = []; 
            var fns = []; 
            for (var j = 0, len = scripts.length; j < len; j++) { 
                var script = scripts[j]; 
                if (script.order == order) { 
                    urls.push(script.src); 
                } 
            } 
            if (i == orders.length - 1) { 
                wdata[order] = processScript(urls) 
            } 
            else { 
                var nextorder = orders[i + 1]; 
                fns.push(wdata[nextorder]); 
                wdata[order] = processScript(urls, fns); 
            } 
        } 
        var exorder = orders[0] 
        wdata[orders[0]](); 
    }; 
    var processScript = function (urls, fn) { 
        return function () { 
            for (var i = 0; i < urls.length; i++) { 
                var se = document.createElement('script'); 
                if (fn && fn[i]) { 
                    se.onload = se.onreadystatechange = fn[i]; 
                } 
                se.src = urls[i]; 
                var s1 = document.getElementsByTagName('script')[0]; 
                s1.parentNode.insertBefore(se, s1); 
            } 
        } 
    } 
 
    if (document.addEventListener) { 
        document.addEventListener("DOMContentLoaded", function () { downloadScripts(); }, false); 
        window.addEventListener("load", function () { setTimeout(processScripts, 0); }, false); 
 
    } else if (document.attachEvent) { 
 
        document.attachEvent("onreadystatechange", function () { downloadScripts(); }); 
        window.attachEvent("onload", function () { setTimeout(processScripts, 0); }); 
    } 
 
})(); 
(function () {
    var document = window.document;
    var getAttribute = function (elem, name) {
        var attrs = elem.attributes;
        var len = attrs.lengthtb;
        for (var i = 0; i < len; i++) {
            var attr = attrs[i];
            if (name === attr.nodeName) {
                return attr.nodeValue;
            }
        }

        return undefined;
    };

    var scriptsData;
    var orders = [];
    var findScripts = function () {
        var aScripts = document.getElementsByTagName('script');
        var len = aScripts.length;
        var scriptsArr = [];
        var scriptsSrc = [];

        for (var i = 0; i < len; i++) {
            var script = aScripts[i];
            if ("text/asynjs" === getAttribute(script, "type") && "undefined" === typeof (script.founded)) {
                script.founded = true;
                var order = getAttribute(script, "order") || getAttribute(script, "data-order") || 0;
                script.order = order;
                if (orders.indexOf(order) < 0) {
                    orders.push(order);
                }
                var src = getAttribute(script, "asynsrc") || getAttribute(script, "data-asynsrc");
                script.src = src;
                if (src && scriptsSrc.indexOf(src) < 0) {
                    scriptsArr.push(script);
                }
            }

        }
        orders.sort(function compare(a, b) { return a - b; });
        return scriptsData = scriptsArr;
    };
    var downloadScripts = function (scriptArr) {
        var scripts = scriptArr || findScripts();
        var len = scripts.length;

        for (var i = 0; i < len; i++) {
            var img = new Image();
            img.src = scripts[i].src;
            img.style.display = "none";
        }
    };

    var processScripts = function (scriptArr) {
        var scripts = (scriptArr && scriptArr.constructor === Array) ? scriptArr : scriptsData;
        var len = scripts.length;
        var failscripts = [];
        var wdata = [];
        for (var i = orders.length - 1; i >= 0; i--) {
            var order = orders[i];
            var urls = [];
            var fns = [];
            for (var j = 0, len = scripts.length; j < len; j++) {
                var script = scripts[j];
                if (script.order == order) {
                    urls.push(script.src);
                }
            }
            if (i == orders.length - 1) {
                wdata[order] = processScript(urls)
            }
            else {
                var nextorder = orders[i + 1];
                fns.push(wdata[nextorder]);
                wdata[order] = processScript(urls, fns);
            }
        }
        var exorder = orders[0]
        wdata[orders[0]]();
    };
    var processScript = function (urls, fn) {
        return function () {
            for (var i = 0; i < urls.length; i++) {
                var se = document.createElement('script');
                if (fn && fn[i]) {
                    se.onload = se.onreadystatechange = fn[i];
                }
                se.src = urls[i];
                var s1 = document.getElementsByTagName('script')[0];
                s1.parentNode.insertBefore(se, s1);
            }
        }
    }

    if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", function () { downloadScripts(); }, false);
        window.addEventListener("load", function () { setTimeout(processScripts, 0); }, false);

    } else if (document.attachEvent) {

        document.attachEvent("onreadystatechange", function () { downloadScripts(); });
        window.attachEvent("onload", function () { setTimeout(processScripts, 0); });
    }

})();调用代码:


[html]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>test</title> 
    <script type="text/javascript" src="Scripts/asynload.js"></script> 
</head> 
<body> 
    <div id="container"> 
        <img src="images/bmw_m1_hood.jpg" width="765" height="574" alt="BMW M1 Hood"> 
 
        <script type="text/asynjs" order="3" asynsrc="test.js"></script> 
        <script type="text/asynjs" order="1" asynsrc="Scripts/jquery-1.7.2.js"></script> 
        <script type="text/asynjs" order="2" asynsrc="Scripts/jquery.lazyload.js"></script> 
 
        <img src="images/bmw_m1_side.jpg" width="765" height="574" alt="BMW M1 Side" /> 
        <img data-original="images/viper_1.jpg" width="765" height="574" alt="Viper 1" /> 
        <img data-original="images/viper_corner.jpg" width="765" height="574" alt="Viper Corner" /> 
        <img data-original="images/bmw_m3_gt.jpg" width="765" height="574" alt="BMW M3 GT" /> 
        <img data-original="images/corvette_pitstop.jpg" width="765" height="574" alt="Corvette Pitstop" /> 
    </div> 
</body> 
</html> 
  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>test</title>
    <script type="text/javascript" src="Scripts/asynload.js"></script>
</head>
<body>
    <div id="container">
        <img src="images/bmw_m1_hood.jpg" width="765" height="574" alt="BMW M1 Hood">

        <script type="text/asynjs" order="3" asynsrc="test.js"></script>
        <script type="text/asynjs" order="1" asynsrc="Scripts/jquery-1.7.2.js"></script>
        <script type="text/asynjs" order="2" asynsrc="Scripts/jquery.lazyload.js"></script>

        <img src="images/bmw_m1_side.jpg" width="765" height="574" alt="BMW M1 Side" />
        <img data-original="images/viper_1.jpg" width="765" height="574" alt="Viper 1" />
        <img data-original="images/viper_corner.jpg" width="765" height="574" alt="Viper Corner" />
        <img data-original="images/bmw_m3_gt.jpg" width="765" height="574" alt="BMW M3 GT" />
        <img data-original="images/corvette_pitstop.jpg" width="765" height="574" alt="Corvette Pitstop" />
    </div>
</body>
</html>

posted @ 2012-09-18 16:29 MR.CHEN 阅读(1644) | 评论 (0) | 编辑 收藏
 
关于JS异步加载的测试
对IE8和Firefox3.6测试结果:
1.常规的在head里面使用Script标签引用js,不再是堵塞模式加载(也就是说脚本文件不再是一个一个被加载,加载完成一个才开始加载另一个),而是最

大6个JS同时开始加载(并发限制为6个),但是script的执行顺序还是按照Script标签顺序,而且会阻碍页面的呈现。
2.由于1的原因,所以使用document.write("<script>...</script>")(此方式对Firefox无效)的方式和head.append(script)(此方式兼容IE和Firefox)的方式

使用异步加载意义不大
3.但是使用head.append(script)的方式,不会阻碍界面的呈现,但是要注意:
(1)如果对于window.onload事件的触发有所影响:在 IE中,window.onload事件会在tb页面其它元素被加载完毕之后立即触发(即不必等所有脚本加载完,而

是html页面加载完),而FireFox里的window.onload事件会等待动态添加的那些脚本文件也被加载完毕后才触发。
(2)虽然我们动态加载的script元素是有严格顺序的,但是浏览器可不一定这样认为。在FireFox中,脚本文件会按照它动态加载的script元素的顺序执

行,而IE会根据脚本文件下载完毕的顺序执行。

注意:
1.在IE6和IE7中,常规的在head里面使用Script标签引用js,是堵塞模式加载,也就是说必须加载完一个JS,才能去加载下一个JS
2.在IE6和IE7中,并发限制是2个。也就是即使使用head.append(script)的方式异步加载3个JS,也会等前两个JS加载完成以后才会加载第三个JS。

测试工具:Firebug,Fiddler,HttpWatch
posted @ 2012-09-18 16:29 MR.CHEN 阅读(1431) | 评论 (0) | 编辑 收藏
 

2012年9月17日

做程序员工作好累啊
嫁人不嫁程序员,
一年到头到处忙,
我是一个程序员,
背井离乡在外忙,
白天累得脑发涨,
晚上仍为资料忙;
思乡痛苦心里藏,
四海漂泊习为常,
长年累月在外奔,
不能回家陪爹娘,
终身大事无心管,
亲戚朋友摧喜糖,
心中有苦说不出,
回答只能笑来搪;
工资一点泪成行,
怎能买起商品房,
压力大得气难喘,
前途在哪路迷茫;
恋人分别各一方,
妹盼大哥早还乡,
相思之苦妹难咽,
距离拉得爱情黄;
好女不嫁程序员,
一年四季守空房,
家中琐事无暇想,
内心愧对爹和娘,
朦胧月色撒地上,
兄弟把酒聚一堂,
后悔走上这条路,
同舟共济把帆扬。
表面风光,内心彷徨;
容颜未老,心已苍桑;
成就难有,郁闷经常;
比骡子累,tb比蚂蚁忙;

posted @ 2012-09-17 16:55 MR.CHEN 阅读(2290) | 评论 (4) | 编辑 收藏
 
仅列出标题