<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    cuiyi's blog(崔毅 crazycy)

    記錄點(diǎn)滴 鑒往事之得失 以資于發(fā)展
    數(shù)據(jù)加載中……

    非常有意思的sql排錯(cuò)

    1)  你看出區(qū)別在哪里了么? 結(jié)果會(huì)一樣么?
    SELECT
    (select first 
    1 longname from ivctrallocpurch a join jcivloc l  on a.ivlocid=l.ivlocid and a.ctrid=A.ctrid) as mill
    FROM CTR A
    JOIN CTRSMRY CS ON (A.CTRID
    =CS.CTRID)
    WHERE A.CTRID
    =3161

    SELECT
    (select first 
    1 longname from ivctrallocpurch a join jcivloc l  on a.ivlocid=l.ivlocid and a.ctrid=3161) as mill
    FROM CTR A
    JOIN CTRSMRY CS ON (A.CTRID
    =CS.CTRID)
    WHERE A.CTRID
    =3161
    結(jié)果為什么不一樣呢?


    2) Integer overflow. The result of an integer operation caused the most significant bit of the result to carry.
    select sum(rcpt.artothome * rate) as amt
    from cashreceipt rcpt
    join homerate rate on rcpt.currencyid=rate.currencyid
    分析:
    artothome @ arheader  is : numeric(18,4)
    rate @ ..  is : numeric(
    10,10)
    改進(jìn)1 (not work)
    select sum(cast(rcpt.artothome * rate as numeric(18,4))) as amt
    from cashreceipt rcpt
    join homerate rate on rcpt.currencyid
    =rate.currencyid
    改進(jìn)2 (works)
    select sum(cast(cast(rcpt.artothome as numeric(18,4)) * cast(rate as numeric(18,4)) as numeric(18,4))) as amt
    from cashreceipt rcpt
    join homerate rate on rcpt.currencyid
    =rate.currencyid
    reason, forward from http://www.firebirdfaq.org/faq207/
    Integer overflow. The result of an integer operation caused the most significant bit of the result to carry.

    Short explanation:
    If you use fixed precision datatypes (smallint, integer, bigint, decimal and numeric), it is possible that the result of calculation doesn
    't fit the datatype. Try casting the values in complex expressions as double precision and see whether the error goes away. If it works and you don't care about being too precise, you can leave it at that. Otherwise you need to check every operation and calculate the result.

    Details:
    Here
    's an example: if you multiply 9.12 with 8.11 (both numeric(18,2)) you would get 73.9632. If Firebird would store that into numeric(18,2) datatype, we would lose 0.0032. Doesn't look much, but when you have complex calculations, you can easily loose thousands (dollars or euros). Therefore, the result is stored in numeric(18,4).

    Problems are rarely seen with such low precision as 
    2. Let's use some bigger precision. For example, numeric(18,6) times numeric(18,6) yields numeric(18,12) result, meaning that maximal value it can store is 9223372.036854775807. If (for example) you wish to keep only 6 digits of precision, you could use something like:

    cast(value1 as numeric(
    18,3)) * cast(value2 as numeric(18,3))

    which would yield numeric(
    18,6) result, but it is quite possible that you would get more accurate result by casting to double:

    cast(cast(value1 as 
    double precision) * cast(value2 as double precision) as numeric(18,6))

    Also, 
    if you have mixed multiplications and divisions it helps to change the order of operations, so that the overflow doesn't happen.


    String sql = "select mbrid from jcmbr where reference4=?";
    假如沒(méi)有記錄
    DynaBean aBean 
    = CxcDataModule.getInstance().getRow(sql, new Object[]{reference4});
    如果直接用aBean.get("
    reference4") 出錯(cuò);
    錯(cuò)誤的原因是
    aBean  為null

    Object obj 
    = {spring jdbctemplate}.queryForObject(sql, new Object[]{reference4}, Integer.class);
    if (obj instanceof Integer)
             System.out.println(
    "(Integer)obj>>>>>>>>>>" + (Integer)obj);
    else if (obj instanceof Map)
                System.out.println(
    "(Integer)obj>>>>>>>>>>" + ((Map)obj).get("REFERENCE4"));
    真是的流程是 if 分支
    如果有數(shù)據(jù),這是對(duì)的
    如果沒(méi)有數(shù)據(jù),直接出錯(cuò),因?yàn)橛袀€(gè)假定有Integer值存在

    int value = JcDataModuleUtils.getJdbcTemplate().queryForInt(sql, new Object[]{reference4});
    出錯(cuò)原因是假定一定會(huì)有一個(gè)int值返回

    15:09:00,438 ERROR [STDERR] Caused by: org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size:
     expected 1, actual 0
    15:09:00,438 ERROR [STDERR]     at org.springframework.dao.support.DataAccessUtils.requiredUniqueResult(DataAccessUtils.java:
    66)
    15:09:00,469 ERROR [STDERR]     at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:620)
    15:09:00,469 ERROR [STDERR]     at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:629)
    15:09:00,469 ERROR [STDERR]     at org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:656)




    posted on 2008-04-08 18:30 crazycy 閱讀(1688) 評(píng)論(0)  編輯  收藏 所屬分類: DBMS

    主站蜘蛛池模板: 亚洲日韩av无码中文| 亚洲天堂中文字幕在线| 久久www免费人成看片| 无码国产精品一区二区免费16| 成在线人免费无码高潮喷水| 国产黄色片免费看| 在线免费视频你懂的| 国产一二三四区乱码免费| 成全动漫视频在线观看免费高清版下载| 久久精品无码免费不卡| 三上悠亚在线观看免费| 鲁丝片一区二区三区免费| 久久久久久久岛国免费播放| 一区二区免费视频| 91国内免费在线视频| 亚洲成年人电影在线观看| 亚洲综合色丁香麻豆| 亚洲天堂一区二区三区| 中文文字幕文字幕亚洲色| 亚洲人成电影网站色www| 国产成人精品日本亚洲语音 | 成人午夜免费福利视频| 91黑丝国产线观看免费| 成年轻人网站色免费看 | 中文字幕在线免费播放| 精品国产一区二区三区免费| 无码av免费网站| 可以免费看黄的网站| 日韩成人在线免费视频 | 91av视频免费在线观看| 成年美女黄网站18禁免费| 又爽又高潮的BB视频免费看| 亚洲综合伊人久久大杳蕉| 亚洲激情在线视频| 在线亚洲高清揄拍自拍一品区| 亚洲gay片在线gv网站| selaoban在线视频免费精品| 久久久免费精品re6| 成人超污免费网站在线看| 亚洲精品视频免费观看| 亚洲精品无码不卡|