[20191013]oracle number型別儲存轉化指令碼.txt
[20191013]oracle number型別儲存轉化指令碼.txt
--//測試看看是否可以利用bc obase=100的輸出解決問題。另外以前指令碼忘記考慮尾數的四捨五入問題。
--//也許程式設計就是這樣,總有一些細節沒有考慮到...
--//程式碼如下num2raw_5.sh:
#! /bin/bash
#! number convert oracle raw.
odebug=${ODEBUG:-0}
# process input parameter ,delete "," and all spaces. save to variable v_num. and length to variable v_len.
v_num="$*"
v_num=${v_num//[, ]/}
# strip e or trailing 0s in decimals or 0000.000 output 0 ,
v_num=$(echo $v_num/1 + 0 | sed -e "s/[eE]+\?/*10^/" -e "s/^/scale=180;/" | bc | tr -d '\n\\\r' | sed -e "s/\.\([0-9]*[1-9]\)0\+$/.\1/" -e "s/\.0\+$//")
if [[ "$v_num" =~ ^-.*$ ]]; then
v_sign=1
v_num=${v_num:1:180}
else
v_sign=0
fi
if [ $odebug -eq 1 ] ; then
echo v_num="$v_num"
fi
v_res=""
if [ "$v_num" == "0" ]; then
v_res="80"
echo "$v_res"
exit 0
fi
v_pos=$(expr index $v_num ".")
if [ $v_pos -gt 1 ]; then
v_exp=$(( v_pos/2 ))
elif [ $v_pos -eq 0 ]; then
v_exp=$(( (${#v_num}+1) /2 ))
elif [ $v_pos -eq 1 ]; then
v_tmp1=${v_num:1:180}
v_tmp2=$(echo $v_tmp1 | sed 's/^0\+//g')
v_exp=$(( (${#v_tmp2} - ${#v_tmp1})/2 ))
fi
v_exp1=$(printf "%02x" $(( $v_exp+192 )))
if [ $v_sign -eq 1 ]; then
v_exp1=$(printf "%02x" $(( 0xff - 0x${v_exp1} )))
fi
v_res=${v_exp1}${v_res}
# oracle number type max length is 22 bytes (not 22 is 21 bytes??), 1 bytes exponent.
# bc不作四捨五入,要加5*10^-41解決問題。
#v_tmp=$(echo "scale=180 ; $v_num / 100^($v_exp) " | bc | tr -d '\n\\\r'| sed -e "s/\.\([0-9]*[1-9]\)0\+$/.\1/" -e "s/\.0\+$//" -e "s/^\.//")
v_tmp=$(echo "scale=180 ; a=$v_num / 100^($v_exp) +5*10^-41; scale=40;a/1 " | bc | tr -d '\n\\\r'| sed -e "s/\.\([0-9]*[1-9]\)0\+$/.\1/" -e "s/\.0\+$//" )
if [ $odebug -eq 1 ] ; then
echo v_num="$v_num" v_len="$v_len" v_exp="$v_exp" v_exp1="$v_exp1" v_tmp="$v_tmp"
fi
if [ $v_sign -eq 0 ]; then
v_res=${v_res}$(echo "obase=100;$v_tmp" | bc | tr -d "." | awk 'BEGIN{RS=" +"}/./{printf ",%02x", $1+1}')
else
v_res=${v_res}$(echo "obase=100;$v_tmp" | bc | tr -d "." | awk 'BEGIN{RS=" +"}/./{printf ",%02x", 101-$1}')
fi
if [ $v_sign -eq 1 -a ${#v_tmp} -lt 40 ]; then
v_res=${v_res}",""66"
fi
echo "$v_res"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2660866/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20190930]oracle number型別儲存轉化指令碼.txtOracle型別指令碼
- [20191003]oracle number型別儲存轉化指令碼.txtOracle型別指令碼
- [20190930]oracle raw型別轉化number指令碼.txtOracle型別指令碼
- Oracle 儲存型別Oracle型別
- oracle中dump函式及oracle NUMBER型別內部儲存機制Oracle函式型別
- 【NUMBER】Oracle資料庫最佳化之理解NUMBER儲存機制Oracle資料庫
- [20150503]關於oracle的number型別.txtOracle型別
- Oracle Lob型別儲存淺析Oracle型別
- [20160828]number型別.txt型別
- ORACLE NUMBER資料型別Oracle資料型別
- 【NUMBER】Oracle的NUMBER資料型別特點Oracle資料型別
- Oracle的number資料型別Oracle資料型別
- Oracle中number型別詳解Oracle型別
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- [20191219]oracle timestamp資料型別的儲存.txtOracle資料型別
- rman儲存指令碼指令碼
- oracle資料型別與儲存結構Oracle資料型別
- 轉摘_儲存型別與連線方式型別
- mysql 轉換表的儲存引擎指令碼MySql儲存引擎指令碼
- Oracle基本資料型別儲存格式淺析(五)——RAW型別Oracle資料型別
- ORACLE NUMBER型別內部實現Oracle型別
- Oracle基本資料型別儲存格式淺析(四)——ROWID型別Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(一)Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(二)Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(三)Oracle資料型別
- Oracle基本資料型別儲存格式淺析(三)——日期型別(四)Oracle資料型別
- [20241009]oracle timestamp with time zone資料型別的儲存.txtOracle資料型別
- Oracle基本資料型別儲存格式淺析[zt]Oracle資料型別
- 字元型別的字元儲存與位元組儲存字元型別
- 建立NFS型別的儲存NFS型別
- Oracle timestamp型別轉換date格式指令碼(精確到秒)Oracle型別指令碼
- 一個簡單函式—Number型別轉換Date型別函式型別
- Oracle基本資料型別儲存格式淺析(二)——數字型別Oracle資料型別
- EF:oracle的number型別對映為C#的boolean型別Oracle型別C#Boolean
- MYSQL 資料型別儲存-數值型MySQL 資料型別
- oracle中number型欄位長度、精度及實際儲存狀態測試(zt)Oracle
- jsp頁面number型別自動轉為String型別JS型別
- Block型別及儲存區域BloC型別