在oracle中字段类型LONG的使用注意事项

本文详细介绍了 Oracle 数据库中 LONG 类型的使用方法及其限制,包括如何通过 JDBC 操作 LONG 类型字段,提供了插入、查询和更新 LONG 字段的具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

===============================================
在oracle中字段类型LONG的使用注意事项
----------------------------------------
LONG数据类型使用上的一些说明
系统环境:
1、操作系统:Windows 2000
2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
3、安装路径:C:/ORACLE

使用说明:
1、LONG 数据类型中存储的是可变长字符串,最大长度限制是2GB。

2、对于超出一定长度的文本,基本只能用LONG类型来存储,数据字典中很多对象的定义就是用LONG来存储的。

3、LONG类型主要用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型。

4、很多工具,包括SQL*Plus,处理LONG 数据类型都是很困难的。

5、LONG 数据类型的使用中,要受限于磁盘的大小。

能够操作 LONG 的 SQL 语句:
1、Select语句

2、Update语句中的SET语句

3、Insert语句中的VALUES语句

限制:

1、一个表中只能包含一个 LONG 类型的列。

2、不能索引LONG类型列。

3、不能将含有LONG类型列的表作聚簇。

4、不能在SQL*Plus中将LONG类型列的数值插入到另一个表格中,如insert into ...select。

5、不能在SQL*Plus中通过查询其他表的方式来创建LONG类型列,如create table as select。

6、不能对LONG类型列加约束条件(NULL、NOT NULL、DEFAULT除外),如:关键字列(PRIMARY KEY)不能是 LONG 数据类型。

7、LONG类型列不能用在Select的以下子句中:where、group by、order by,以及带有distinct的select语句中。

8、LONG类型列不能用于分布查询。

9、PL/SQL过程块的变量不能定义为LONG类型。

10、LONG类型列不能被SQL函数所改变,如:substr、instr。

 

SQL*Plus 中操作 LONG类型列:
1、set long n

2、col 列名 format An

n代表n位字符(n为大于零的整数),An表示将此列的数据显示宽度限制为不超过n位。
long类型的数值不能用insert into ... select的方法插入,故我们要分两步走,先插入其它字段,最后再插入long类型字段,这可以通过过程来实现.下面是一个做实验实现的例子.

==============================================================================
利用oracle long类型字段,插入大文本
-----------------------------------
我在编写应用时,需要大量的插入大文本,但是oracle 的clob操作起来比较繁琐,应此我没有选择使用clob,而是使用了oracle以前版本中的long类型[但是long类型有一些限制,在一个表中只能有一个long字段]。

开始的时候我直接使用insert into table1 values(a,b[long])的方式插入数据库,但是oracle有些限制一条语句不能超过4000个字符,并报ORA-01704的错误。

经过查找oracle 的文档找到了解决的方法,就是对于long的字段使用setCharacterStream()方法将String插入数据库。

代码:
sql="insert into msg_info values (?,?,?,?[long类型字段],'C',sysdate,sysdate+"+msgterm+",?)";
pstat1 = conn.prepareStatement(sql);
pstat1.setLong(1, msg_id);
      pstat1.setInt(2, msg_gp_id);
      pstat1.setString(3, msg_title);
      pstat1.setCharacterStream(4,new StringReader(msg_info.toString()),msg_info.length());
conn.commit();
      pstat1.setLong(5, this.upid);

long类型oracle并不推荐,还是采用CLOB才是正路,毕竟现在已是21世纪。
但是CLOB的确用起来非常麻烦,楼主的贴子收藏。

****************************************
使用JDBC存取ORACLE中的LONG类型的数据
****************************************

在ORACLE中可以使用LONG类型保存大文本,但是操作LONG类型的数据和一般的数据类型不同,下面就举例说明如何将数据保存到LONG类型的字段中.

保存数据到LONG类型的字段中,下面将使用一个表进行测试,该表的创建语句如下:

CREATE TABLE T_LONGTEST
(
  ID        INTEGER                             NOT NULL,
  FILENAME  VARCHAR2(100 BYTE),
  CONTENT   LONG
)
LOGGING
NOCACHE
NOPARALLEL;

CREATE UNIQUE INDEX PK_T_LONGTEST ON T_LONGTEST
(ID)
LOGGING
NOPARALLEL;

ALTER TABLE T_LONGTEST ADD (
  CONSTRAINT PK_T_LONGTEST PRIMARY KEY (ID));

插入LONG类型的数据

    BufferedReader bufReader = new BufferedReader(new FileReader(file));
    Integer id = Integer.valueOf(PubFun1.CreateMaxNo(TEST_LONG_ID, 1));
    PreparedStatement pstmt = con.prepareStatement(INSERT_LONG_SQL);
    pstmt.setObject(1, id);
    pstmt.setObject(2, fileName);
    pstmt.setCharacterStream(3, bufReader, (int) length);
    int retValue = pstmt.executeUpdate();
    if (retValue != 1) {
        logger.error("Error on insert value");
    }
    bufReader.close();
    pstmt.close();

INSERT_LONG_SQL的值为:
INSERT INTO T_LONGTEST(ID, FILENAME, CONTENT) VALUES (?, ?, ?)
注意需要使用setCharacterStream方法设置LONG类型的字段的值.

读取LONG类型的数据

读取也需要使用Stream的方式来读取,下面的代码片断说明了读取LONG类型的字段的方法.
    PreparedStatement pstmt = con.prepareStatement(QUERY_LONG_COL_SQL);
    pstmt.setObject(1, id);
    ResultSet rs = pstmt.executeQuery();
    if (rs.next()) {
        Reader reader = rs.getCharacterStream(1);
        BufferedReader bufReader = new BufferedReader(reader);
        StringBuffer strBuf = new StringBuffer();
        String line;
        while ((line = bufReader.readLine()) != null) {
            strBuf.append(line);
            strBuf.append("/r/n");
        }
        bufReader.close();
        System.out.println("The content is:" + strBuf.toString());
    }
QUEYR_LONG_COL_SQL的取值为:SELECT CONTENT FROM T_LONGTEST WHERE ID=?

更新LONG类型的数据

更新LONG类型的方法和插入的代码是一样的,只是SQL语句不同.下面的代码断说明了如何更新LONG类型的数据.(这个例子没有使用T_LONGTEST表)
    StringReader reader = new StringReader(xmlString);
    pstmt = con
            .prepareStatement(REPORT_MODEL_CONTENT_UPDATE_SQLSTRING);
    pstmt.setCharacterStream(1, reader, xmlString.length());
    pstmt.setInt(2, reportModelId);
    if (pstmt.executeUpdate() == 0) {
        logger
                .error("Error on update");
    }
    reader.close();
REPORT_MODEL_CONTENT_UPDATE_SQLSTRING的取值为:
UPDATE REPORT_MODEL SET CONTENT=? WHERE REPORT_MODEL_ID=?

总结:

从上面的例子可以看到,操作LONG类型的字段主要是通过CharacterStream,如果是更新数据库或者将数据插入到数据库中使用PreparedStatement的setCharacterStream,并且传入Reader类型的参数和字符串的长度.如果是检索数据库中的LONG类型的数据,那么使用getCharacterStream方法,获得一个Reader类型的对象,然后就可以从其中获取LONG类型的数据了.


 

Oracle数据库支持多种字段类型,以满足不同数据存储和处理的需求。以下是常见的Oracle字段类型分类: ### 数据类型分类 #### 1. **字符类型** - `CHAR(n)`:固定长度的字符数据,最大长度为2000字节。 - `VARCHAR2(n)`:可变长度的字符数据,最大长度为4000字节。 - `NCHAR(n)`:用于存储Unicode字符的固定长度数据。 - `NVARCHAR2(n)`:用于存储Unicode字符的可变长度数据。 #### 2. **数值类型** - `NUMBER(p, s)`:用于存储精确的数值数据,其中`p`表示精度(总位数),`s`表示小数位数。 - `FLOAT`:用于存储浮点数。 - `BINARY_FLOAT` 和 `BINARY_DOUBLE`:用于存储32位或64位浮点数,适合科学计算。 #### 3. **日期与时间类型** - `DATE`:存储日期和时间信息,包括年、月、日、小时、分钟、秒。 - `TIMESTAMP`:提供比`DATE`更高的精度,可以存储到纳秒级别的时间。 - `TIMESTAMP WITH TIME ZONE`:包含时区信息的时间戳。 - `TIMESTAMP WITH LOCAL TIME ZONE`:存储在数据库中时会转换为数据库时区,但显示时根据会话时区调整。 #### 4. **大对象类型 (LOB)** - `CLOB`:存储大量文本数据,支持单字节字符集。 - `NCLOB`:类似于`CLOB`,但支持Unicode字符。 - `BLOB`:存储二进制数据,如图片、音频或视频文件。 - `BFILE`:指向存储在操作系统文件系统中的大型二进制文件。 #### 5. **行标识符类型** - `ROWID`:伪列类型,表示行的物理地址,通常用于快速定位表中的特定行[^2]。 - `UROWID`:通用行标识符,适用于索引组织表和其他类型的表。 #### 6. **其他特殊类型** - `RAW(n)`:存储原始二进制数据,最大长度为2000字节。 - `LONG`:用于存储可变长度的文本数据,最大长度为2GB,但已逐渐被`CLOB`取代。 - `LONG RAW`:用于存储原始二进制数据,最大长度为2GB,已被`BLOB`取代。 - `XMLType`:专门用于存储和操作XML文档的数据类型。 ### 示例代码 以下是一个创建表并定义各种字段类型的示例: ```sql CREATE TABLE example_table ( id NUMBER PRIMARY KEY, name VARCHAR2(100), description CLOB, created_date DATE, updated_time TIMESTAMP, binary_data BLOB, row_id ROWID ); ``` ### 注意事项 - 在修改已有数据的字段类型时,Oracle数据库有一些限制。例如,如果字段中存在数据,则不能直接更改字段类型[^1]。 - 对于某些复杂的数据转换需求,可能需要使用中间步骤,如添加新字段、迁移数据、删除旧字段等。 - Oracle不支持在指定字段后新增字段的功能,而MySQL支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值