需求:将一个程序错误产生的log的每一行插入Oracle的一个表中以便分析错误
本人用oracle的一些技术解析该文件达不到预期要求,然后用java解析该文件。查看多处资料终于完成该要求。
解决方案:先在数据库建表,存长字符串的字段类型设为clob,然后用jdbc就把该字段当成String就行。oracle将自动将长字符串装入clob中。
代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @author lx
* desc:对于较长字符串来说,只要数据库该字段的类型设为了Clob。程序只要通过setString即可达到插入目的
*/
public class InsertClob {
public static void main(String[] args) {
File errorFile=new File("src/error.log");
InputStreamReader isr=null;//用于设置读取字符的编码
Connection conn=null;//数据库连接
PreparedStatement pst=null;//用于设置sql语句
BufferedReader br=null;//用于读取文件的每一行
try {
Class.forName("oracle.jdbc.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");
pst=conn.prepareStatement("insert into t_error_log values(?,?)");
conn.setAutoCommit(false);
isr=new InputStreamReader(new FileInputStream(errorFile),"gbk");
br=new BufferedReader(isr);
String tempString=null;
int line=1;
while((tempString=br.readLine())!=null){
pst.setInt(1, line);
pst.setString(2, tempString);
pst.addBatch();
System.out.println("line"+line+" : "+tempString);
if(line%50==0){
pst.executeBatch();
} ;
line++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
try {
if(!conn.isClosed()){
conn.rollback();
System.out.println("插入失败,回滚!");
}
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
isr.close();
br.close();
pst.close();
conn.close();
}catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
相关推荐
我们需要编写一个控制文件(.ctl文件),它定义了如何解析TXT文件和如何将数据插入到数据库表中。 4. **编写控制文件**:控制文件包含了关于如何读取TXT文件和加载数据的具体指令。例如,指定字段的分隔符、是否...
为了实现向Oracle数据库中插入随机数的目标,我们首先需要创建一个自定义函数`F_Random_ZeroOrOne`。该函数接收一个数值参数,并根据这个数值返回0或1。这里使用了`DBMS_RANDOM.VALUE()`函数生成一个0到1之间的...
例如,如果要将字符集设置为简体中文GBK,可以添加以下行: ``` NLS_LANG = SIMPLIFIED CHINESE_CHINA.GBK ``` 2. 环境变量设置:除了在sqlnet.ora文件中设置,也可以在操作系统层面设置NLS_LANG环境变量。在...
- 将每列的数据拼接成一行,并使用 `utl_file.put_line` 写入文件。 4. **异常处理**: - 捕获并处理可能出现的异常情况,如超出定义列范围时跳出循环。 #### 四、总结 通过上述分析,我们可以了解到利用Oracle ...
本教程将详细讲解如何将TXT文件中的数据导入到Oracle数据库,并利用Map进行操作,同时涉及文件流、截取字符串以及Map的相关知识点。 首先,我们需要理解文件流的概念。在Java编程中,文件流是处理输入/输出(I/O)的...
- 可以使用`INSERT`语句结合`OPENDATASOURCE`查询文本文件中的数据,然后将这些数据插入到Oracle数据库的相应表中。示例如下: ```sql INSERT INTO oracle_table_name (column1, column2) SELECT column1, ...
首先,我们需要了解“TXT2DB”这个文件名可能代表一个程序或者脚本,它的功能是从文本文件(TXT)读取数据,并将其转换到Oracle数据库中的相应表。这个过程通常涉及到以下步骤: 1. **数据预处理**:在将文本文件...
首先,我们需要创建一个测试表,并插入一些测试数据。这个测试表的结构如下: ```sql create table test (NO NUMBER, VALUE VARCHAR2(100), NAME VARCHAR2(100)); ``` 然后,我们插入一些测试数据: ```sql ...
- `columnRowData`: 是一个字典类型,键为列名,值为该列对应的多个行数据组成的数组。这种设计可以方便地组织待插入的数据。 - **异常处理** - 如果`tableName`为空,则抛出`ArgumentNullException`。 - 如果`...
行迁移是指当一个数据库行在一个分配的块中无法完全容纳时,Oracle会将行的一部分移动到下一个可用的数据块中。这种情况通常发生在行大小超过单个数据块大小,但行中的一部分仍然可以适应原始块的情况。行迁移会导致...
7. 缺少列(91742000):当我们尝试插入数据到一个表中,但遗漏了某些列时,Oracle 将抛出这个错误代码。例如,如果我们尝试插入数据到 emp 表中,但遗漏了 ename 列,将导致该错误。 示例代码:INSERT INTO emp ...
6. **执行批量插入**:开启事务,使用Oracle数据库的批处理功能,循环遍历Excel数据,为每个行数据创建一个参数化SQL命令,并执行插入操作。这样可以提高数据导入的效率。 7. **错误处理**:在整个过程中,应捕获...
如果在TOAD中执行,建议在每个脚本的第一行都加上此命令,因为TOAD不会记住之前的设置。在SQL*PLUS中,只需设置一次,后续导入的脚本都不会受影响,除非再次设置`DEFINE ON`。 2. **方法二:使用`CHR(38)`替换`&`**...
从给定的文件信息中,我们可以提取到关于Oracle数据库中SQL操作的重要知识点,特别是与创建表、定义主键约束以及插入数据相关的操作。下面将详细解释这些知识点。 ### 创建表 在Oracle数据库中,`CREATE TABLE`...
1. **一对一**:一个表中的每一行都对应另一个表中的一行。可以通过定义一个共同的主键或者外键来实现。 2. **一对多**:一个表中的每一行对应另一个表中的多行。通常在“多”这一方定义外键指向“一”这一方的主键...
4. **导入Excel页面**:这个页面可能是用户上传Excel文件的地方,它可能包含一个文件输入控件,用户可以通过点击选择文件,然后提交表单或通过JavaScript触发导入操作。 5. **后台处理**:当用户上传Excel文件后,...
- **直接插入大记录**: 当插入的记录本身过大,以至于无法在一个数据块中完整存放时,就会产生行链接。例如,一个包含大量文本数据的记录可能会被分割并链接起来存储在多个数据块中。 - **更新记录导致过大**: 在...
行链接是指当一行数据过大以至于无法在一个数据块中完整存放时,Oracle会将这行数据分割并存储在多个数据块中。这种情况通常发生在表中某行的数据大小超过了数据库块的大小时。 ##### 行链接的影响 - **对查询的...
2. **函数创建**:创建一个用户定义的函数来解析这个字符串,并将其插入到目标表中。 ```sql CREATE FUNCTION [dbo].[fun_funcname] (@str VARCHAR(max), @splitchar CHAR(1), @splitchar2 CHAR(1)) RETURNS @t ...
在 Oracle 中,分组后拼接分组字符串是一种常见的操作,用于将分组后的多条记录的某字段进行拼接。下面我们来详细介绍如何实现这种操作。 首先,创建一个测试表 `test`,该表包含三个字段:`NO`、`VALUE`、`NAME`。...