首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取LONG RAW的长度

获取LONG RAW的长度
EN

Stack Overflow用户
提问于 2011-03-31 16:42:04
回答 3查看 28.8K关注 0票数 8

我有一个表,其中有一个数据类型为LONG RAW的列。如何确定此列中数据的大小(以字节为单位)?

如果我对它调用LENGTH函数,它将引发ORA-00932: inconsistent datatypes: expected NUMBER got LONG BINARY

以防万一:UTL_RAW.LENGTH引发了ORA-00997: illegal use of LONG datatype :)

(是的,我知道LONG RAW已经被弃用了--这个问题是由于一些旧软件可能需要它而出现的)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-31 20:47:00

我认为在PLSQL中不可能操作超过32k的LONG RAWs。下面是一个返回LONG RAW长度的java过程。

首先,设置:

代码语言:javascript
复制
SQL> CREATE TABLE my_table (ID NUMBER, my_long_raw_column LONG RAW);

Table created

SQL> INSERT INTO my_table VALUES (1, utl_raw.cast_to_raw('123456789'));

1 row inserted

java类(我的java有点生疏):

代码语言:javascript
复制
SQL> CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Raw" AS
  2  import java.io.*;
  3  import java.sql.*;
  4  import oracle.jdbc.driver.*;
  5  
  6  public class Raw {
  7  
  8     public static int getLength(int pk) throws SQLException,IOException {
  9  
 10        Connection conn = new OracleDriver().defaultConnection();
 11  
 12        PreparedStatement ps = conn.prepareStatement
 13           ( "SELECT my_long_raw_column FROM my_table WHERE id = ?" );
 14        ps.setInt( 1, pk);
 15        ResultSet rs = ps.executeQuery();
 16  
 17        int len = 0;
 18        if (rs.next()) {
 19           InputStream is = rs.getBinaryStream(1);
 20           int nb = is.read(new byte[1024]);
 21           while (nb>0) {
 22              len += nb;
 23              nb = is.read(new byte[1024]);
 24           }
 25        } else
 26           len = -1;
 27  
 28        rs.close();
 29        ps.close();
 30
 31        return len;
 32     }
 33  }
 34  /

Java created

让我们称它为:

代码语言:javascript
复制
SQL> CREATE OR REPLACE
  2  FUNCTION get_lr_length(p_id NUMBER) RETURN NUMBER
  3  AS LANGUAGE JAVA
  4  NAME 'Raw.getLength(int) return int';
  5  /

Function created

SQL> select get_lr_length(id) from my_table;

GET_LR_LENGTH(ID)
-----------------
                9

我已经用超过32k的字段测试了这个函数,它似乎可以工作。

票数 6
EN

Stack Overflow用户

发布于 2011-03-31 16:44:08

只要列中的数据不超过16,383个字节,就可以使用PL/SQL函数来解决这个问题,例如

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION get_lr_length (id IN NUMBER)
  RETURN NUMBER IS
  raw_data LONG RAW;
  hex_data VARCHAR2(32767);
  len      NUMBER;
BEGIN
  SELECT my_long_raw_column INTO raw_data
  FROM my_table
  WHERE my_table.id = get_lr_length.id;
  hex_data := RAWTOHEX(raw_data);
  len := LENGTH(hex_data) / 2;
  RETURN len;
END get_lr_length;

不幸的是,一个长的RAW可以容纳2 2GB...

票数 2
EN

Stack Overflow用户

发布于 2014-08-02 06:17:33

如果您使用的是一个小型测试数据库,那么有一个不好的技巧可能会有所帮助:使用BLOB而不是LONG RAW复制表中的所有数据。

代码语言:javascript
复制
create table START(ID int not null, VAL long raw);
... inserts
create table START_BLOB(ID int not null, VAL blob);
insert into START_BLOB(ID,VAL) select ID,to_lob(VAL) from STAR;
select ID,length(VAL) from START_BLOB;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5497238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档