免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1764 | 回复: 3
打印 上一主题 下一主题

请教高手:shell-关于在循环中做oracle连接的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-28 18:51 |只看该作者 |倒序浏览
出现问题的情况是这样的,
我需要读取一个文件,按行读取,直至读完.
每读一行的时候根据读取的值生成update语句,然后update数据库.
现在小弟在循环中做连接的时候总是过不了,return code 为非正常值,
且无提示信息.以下为出现问题的代码,请指教.
temp_file=${APP_INPUT_DIR}temp.dat
cat ${inputfile} >> ${temp_file}

while read -r line
do
accoutno=`echo "$line" | cut -c 1-10`
statementdate=`echo "$line" | cut -c 12-18`
payduedate=`echo "$line" | cut -c 20-28`
echo "accoutno : " ${accoutno}
echo "statementdate : " ${statementdate}
echo "payduedate : " ${payduedate}
sqlplus -s ${DB_LOGIN}/${DB_PASSWORD}@${DB_NAME}<<EOF
       
        UPDATE CCARD_trans ECCARD_TRANS SET CC_TRANS_STATUS = 0 WHERE ACCOUNT_NO = ${accoutno} AND STATEMENT_DATE = TO_DATE('${statementdate}','YYYYMMDD') AND PAYMENT_DUE_DATE = TO_DATE('${payduedate}','YYYYMMDD');
       
        exit;
        updEOF
        EOF
done < ${temp_file}
        rm ${temp_file}

如有其他方法能完成同样的功能,也行,小弟先谢了.

论坛徽章:
0
2 [报告]
发表于 2005-04-28 23:30 |只看该作者

请教高手:shell-关于在循环中做oracle连接的问题

one update statement will open a connection to database , even it works but still a very very bad strategy of using database . suggest to use shell generate a sql file first  , the file could be looks like this

update .. set .. where .. and .. and ..and.. ;
update .. set .. where .. and .. and ..and.. ;
....
commit;

to generate the sql ,same as what you do , using while read loop through the file ,  use echo command can simply generate the sql statement .

Ex:
do
echo "update table set .. =$accountno.." >> update_table.sql
done   

then connect to database , run update_table.sql at once .

论坛徽章:
0
3 [报告]
发表于 2005-05-31 10:50 |只看该作者

请教高手:shell-关于在循环中做oracle连接的问题

thanks to 精灵王,
问题已经解决,前段时间较忙,现在才上来回复,让此帖有更意义
解决方法确实是先生成sql文件,然后再一次执行,现将代码帖在下面
for file in $FILE_LIST
do
       ORIG_FILE=`basename $file`
       INPUT_DIR=`dirname $file`
echo
sqlplus -s /nolog << EOF
connect ${DB_LOGIN}/${DB_PASSWORD}@${DB_NAME}
@${APP_SQL_NAME} ${INPUT_DIR} ${ORIG_FILE} ${SYS_TEMP_DIR} ${JOB_ID}
exit;
/
EOF
我拿掉了while循环,直接在sql文件中做处理,然后执行这个sql文件就行了.

论坛徽章:
0
4 [报告]
发表于 2005-05-31 11:12 |只看该作者

请教高手:shell-关于在循环中做oracle连接的问题

其中@${APP_SQL_NAME} ${INPUT_DIR} ${ORIG_FILE} ${SYS_TEMP_DIR} ${JOB_ID}  是执行sql的语句,
{APP_SQL_NAME}中包含路径和sql文件的名字.
现将sql文件也帖出来
set pagesize 0
set heading off

SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') "JOB STARTED" FROM DUAL;

DECLARE
        V_INPUT_HANDLE          UTL_FILE.FILE_TYPE;
        V_ACTLOG_HANDLE         UTL_FILE.FILE_TYPE;
        V_ACTLOG_FILE           VARCHAR(50);
        V_LINE                  VARCHAR(100);
        V_INPUT_DIR             VARCHAR(100);   
        V_LOG_DIR               VARCHAR(100);   
        V_JOB_ID                VARCHAR(15);   
        V_FILE_NAME             VARCHAR(100);   
        V_STATUS                NUMBER;

        V_ACCOUNT_NO            VARCHAR(15);
        V_STAT_DATE                VARCHAR(15);
        V_PDUE_DATE                VARCHAR(15);
        ERR_NUM                 NUMBER(5);
        ERR_MSG                 VARCHAR(100);
        V_COUNTER               NUMBER(5)  ;
BEGIN

        V_INPUT_DIR     := '&1';
        V_FILE_NAME     := '&2';
        V_LOG_DIR       := '&3';
        V_JOB_ID        := '&4';
        V_ACTLOG_FILE :=  V_JOB_ID||'_ACTLOG.log';

        V_COUNTER   := 0;
        V_INPUT_HANDLE :=UTL_FILE.FOPEN(V_INPUT_DIR, V_FILE_NAME, 'R');
        V_ACTLOG_HANDLE:=UTL_FILE.FOPEN(V_LOG_DIR, V_ACTLOG_FILE , 'W');
        
        UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE,'------Start Process -----');
        UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE,'filename=' || V_FILE_NAME);

       /*     process detail records  */
        LOOP
                UTL_FILE.GET_LINE(V_INPUT_HANDLE,V_LINE);
                V_ACCOUNT_NO := SUBSTR(V_LINE,1,10);
                V_STAT_DATE   := SUBSTR(V_LINE,12, ;
                V_PDUE_DATE   := SUBSTR(V_LINE,21, ;
                UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE, 'A/C,  PAYMENTDATE:' ||V_ACCOUNT_NO ||','|| V_STAT_DATE );
                UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE, 'A/C,  PAYMENTDATE:' ||V_ACCOUNT_NO ||','|| V_PDUE_DATE );
                /*    to restore inactive_date     */
                UPDATE CCARD_TRANS SET CC_TRANS_STATUS = 0
                WHERE ACCOUNT_NO = V_ACCOUNT_NO AND STATEMENT_DATE = TO_DATE(V_STAT_DATE,'YYYYMMDD')
                AND PAYMENT_DUE_DATE = TO_DATE(V_PDUE_DATE,'YYYYMMDD');
               
                V_COUNTER := V_COUNTER + 1;
                IF ( V_COUNTER > 100 ) THEN
                  BEGIN
                        COMMIT;
                        V_COUNTER := 0;
                  END;
                END IF;
        END LOOP;

        COMMIT;
        UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE,'------Process End--- ');
        UTL_FILE.FCLOSE(V_INPUT_HANDLE);
        UTL_FILE.FCLOSE(V_ACTLOG_HANDLE);

EXCEPTION
       WHEN UTL_FILE.INVALID_PATH OR UTL_FILE.INVALID_MODE OR UTL_FILE.INVALID_FILEHANDLE OR UTL_FILE.INVALID_OPERATION OR UTL_FILE.INTERNAL_ERROR OR UTL_FILE.WRITE_ERROR THEN
               DBMS_OUTPUT.PUT_LINE('Program Error! File Handler Error!');
               UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE,' File Handler Error!');
                UTL_FILE.FCLOSE(V_INPUT_HANDLE);
                UTL_FILE.FCLOSE(V_ACTLOG_HANDLE);
        WHEN NO_DATA_FOUND THEN
                UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE,'the end of file ');
                UTL_FILE.FCLOSE(V_INPUT_HANDLE);
                UTL_FILE.FCLOSE(V_ACTLOG_HANDLE);
        WHEN OTHERS THEN
               ERR_NUM := SQLCODE;
               ERR_MSG := SUBSTR(SQLERRM, 1, 100);
               DBMS_OUTPUT.PUT_LINE('Unhandled Error!');
               DBMS_OUTPUT.PUT_LINE(err_num || ' ' || err_msg);
                UTL_FILE.PUT_LINE(V_ACTLOG_HANDLE, err_num || ' ' || err_msg);
                UTL_FILE.FCLOSE(V_INPUT_HANDLE);
                UTL_FILE.FCLOSE(V_ACTLOG_HANDLE);

END;
/

thanks ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP