新公司需要写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))

#######################################################################