新公司需要写pl\sql,日常编码过程中,一些简单而重复的操作耗费了不少时间,由于公司不能向外提交数据,电脑又禁用usb,所以只能通过博客这个中转站获取在家里准备写好的脚本。下面的代码我就不详细解释了,有同样需求的朋友自己研究下,不明白或者有需要改进的地方欢迎发邮件。
字段匹配
$ cat tt1
Name Null? Type
----------------------------------------- -------- ----------------------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
$ cat tt2
DNAME ssss
$ cat to_verify
#!/bin/bash
export PATH=/u01/app/oracle/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
cat /dev/null > result
sed -e '1,3d' -e 's/NOT NULL//g' $1 > tmp1
awk '{if(!s[NR])s[NR]=$1;if(FNR>x)x=NR;a[$1]=$2}END{for(i=1;i<=x;i++)print s[i],a[s[i]]}' tmp1 $2 > result
rm tmp1
$ ./to_verify tt1 tt2
$ cat result
DEPTNO NUMBER(2)
DNAME ssss
LOC VARCHAR2(13)
利用CAST进行类型转换
$ cat to_cast
#!/bin/bash
export PATH=/u01/app/oracle/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oracle/bin
cat /dev/null > result
sed -e 's/NOT NULL//g' -e "s/^ \([A-Z_]*[A-Z]\).*(\([0-9]*\))/CAST(NVL(\1,' ') AS CHAR(\2))/g" -e "s/ \([A-Z_]*[A-Z]\).*DATE/TO_DATE(\1,'YYYY-MM-DD')/g" $1 > result
echo "#################################EXAMPLE###############################" >> result
echo "cast(nvl(max(sal),'1') as char(23))" >> result
echo "cast(nvl(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),' ') as char(23))" >> result
echo "########################################################################" >> result
$ ./to_cast tt1
$ cat result
CAST(NVL(DEPTNO,' ') AS CHAR(2))
CAST(NVL(DNAME,' ') AS CHAR(14))
CAST(NVL(LOC,' ') AS CHAR(13))
#################################EXAMPLE###############################
cast(nvl(max(sal),'1') as char(23))
cast(nvl(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),' ') as char(23))
#######################################################################