关于JAVA解析文本的问题

KuKluxKlan 2005-12-15 09:50:21
文本文件为
set serveroutput on
spool c:\exchange.logs
begin
begin
savepoint sp113413097532810000;
update tbl_new_part set new_part_no='3406Z07-001-A',new_part_name='液力转向
泵',new_part_serial='',new_part_origin=0,new_part_amount=1,new_part_amount1=1,new_part_money=0.0,new_part_money1=0.0,new_part_manager=0.0,new_part_manager1=0.0,new_part_provider='81DL002',new_part_pname='大连液压件厂',new_part_price=421.57,ck_serial=2000008383,ck_number='' where new_part_id=2000007172;
commit;
DBMS_OUTPUT.PUT_LINE('执行成功—sp113413097532810000');
exception
when others then
rollback to sp113413097532810000;
DBMS_OUTPUT.PUT_LINE('执行失败—sp113413097532810000');
end;
begin
savepoint sp113413102387510000;
update tbl_new_part set new_part_no='3406Z07-001-A',new_part_name='液力;
转向泵',new_part_serial='',new_part_origin=0,new_part_amount=1,new_part_amount1=1,new_part_money=0.0,new_part_money1=0.0,new_part_manager=0.0,new_part_manager1=0.0,new_part_provider='81DL002',new_part_pname='大连液压件厂',new_part_price=421.57,ck_serial=2000008383,ck_number='' where new_part_id=2000007172;
commit;
DBMS_OUTPUT.PUT_LINE('执行成功—sp113413102387510000');
exception
when others then
rollback to sp113413102387510000;
DBMS_OUTPUT.PUT_LINE('执行失败—sp113413102387510000');
end;
begin
savepoint sp113413107653110000;
update tbl_new_part set new_part_no='3406Z07-001-A',new_part_name='液力;
转向泵',new_part_serial='',new_part_origin=0,new_part_amount=1,new_part_amount1=1,new_part_money=0.0,new_part_money1=0.0,new_part_manager=0.0,new_part_manager1=0.0,new_part_provider='81DL002',new_part_pname='大连液压件厂',new_part_price=421.57,ck_serial=2000008383,ck_number='' where new_part_id=2000007172;
update tbl_new_part set new_part_no='3406Z07-001-A',new_part_name='液力转向泵',new_part_serial='',new_part_origin=0,new_part_amount=1,new_part_amount1=1,new_part_money=0.0,new_part_money1=0.0,new_part_manager=0.0,new_part_manager1=0.0,new_part_provider='81DL002',new_part_pname='大连液压件厂',new_part_price=421.57,ck_serial=2000008383,ck_number='' where new_part_id=2000007172;
commit;
DBMS_OUTPUT.PUT_LINE('执行成功—sp113413107653110000');
exception
when others then
rollback to sp113413107653110000;
DBMS_OUTPUT.PUT_LINE('执行失败—sp113413107653110000');
end;
等等。
我需要逐行读取,并把其中的SQL语句解析出。放入stm.addbatch(sql);
有没有哪位能给个解决方案?
这里的读取已经没有问题。只需要把SQL分解出来。
...全文
275 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
congliu 2005-12-30
  • 打赏
  • 举报
回复
有个类tokenizer,可以读出每个单词
零上三度 2005-12-29
  • 打赏
  • 举报
回复
buffer也不一定全读啊,
0) 设置一个Set,作为分析器,存储所有用作分割的关键字
1) 设置一个读取行数,比如n放到buffer
2-1) 每次读一个buffer,去匹配Set,如果匹配到了,就将语句分离出来,并记住位置
2-2) 如果没读到,就扩大buffer(再读入一段n行),重复2-1
3) 从记住的位置继续,重复2-1
需要注意的是,位置需要用二维的
KuKluxKlan 2005-12-20
  • 打赏
  • 举报
回复
所以说这个地方很郁闷。他的SQL可能存有多行。在看几天吧。。如果不行就接帖了。
mail25 2005-12-19
  • 打赏
  • 举报
回复
跨行读取有时候会漏字符,当然这个机率并不高,但如果是SQL语句,少了字符就会出问题啊
mail25 2005-12-19
  • 打赏
  • 举报
回复
你可以自定义一些关键字,程序里按关键字来解析这些个语句,不一定需要按行来读
比如:
InsertStar: Statement :InsertEnd
按你的要求,要SQL语句就只取你定义的标记之间的东西就可以了,别的也一样的道理
KuKluxKlan 2005-12-16
  • 打赏
  • 举报
回复
楼上的各位。先谢谢。这个我是用statement.addBatch(sql)做的。已成功了。但有几个特殊情况。当一行结尾有“;”但SQL语句并没有结束的。
我是按照COMMIT来判断语句结束的。这样又有一种新的问题了。。一个SAVEPOINT和一个COMMIT之间可能出现多条SQL。我觉得这里应该可以用递归的方法把SQL解析出来。不过还是不太会写。头有点大。。。。。
逍遥小飞狼 2005-12-16
  • 打赏
  • 举报
回复
你的语句只能在oracle的sqlplus里执行吧?java里应该不能执行
TomyGuan 2005-12-16
  • 打赏
  • 举报
回复
一條條拿出來。

看到update,insert,delete的話就從那開始。

結束是用;來結束。

試試。
KuKluxKlan 2005-12-16
  • 打赏
  • 举报
回复
lcwlyl(网络幽灵) :
我这个文件比较大,多的时候有几万行,最少也有一万左右。如果放在buffer里面这个方法不是太好的。
网络精灵 2005-12-15
  • 打赏
  • 举报
回复
BufferedReader bufferedreader = new BufferedReader(new FileReader(文件));
String stxt = bufferedreader.readLine();
读出文件,再一条一条插入应该可以吧。
KuKluxKlan 2005-12-15
  • 打赏
  • 举报
回复
晕倒。难道100分也没人理么。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧