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

===============================================
在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类型的数据了.


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值