我有一个表,其中有一个数据类型为LONG RAW的列。如何确定此列中数据的大小(以字节为单位)?
如果我对它调用LENGTH函数,它将引发ORA-00932: inconsistent datatypes: expected NUMBER got LONG BINARY。
以防万一:UTL_RAW.LENGTH引发了ORA-00997: illegal use of LONG datatype :)
(是的,我知道LONG RAW已经被弃用了--这个问题是由于一些旧软件可能需要它而出现的)
发布于 2011-03-31 20:47:00
我认为在PLSQL中不可能操作超过32k的LONG RAWs。下面是一个返回LONG RAW长度的java过程。
首先,设置:
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 insertedjava类(我的java有点生疏):
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让我们称它为:
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的字段测试了这个函数,它似乎可以工作。
发布于 2011-03-31 16:44:08
只要列中的数据不超过16,383个字节,就可以使用PL/SQL函数来解决这个问题,例如
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...
发布于 2014-08-02 06:17:33
如果您使用的是一个小型测试数据库,那么有一个不好的技巧可能会有所帮助:使用BLOB而不是LONG RAW复制表中的所有数据。
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;https://stackoverflow.com/questions/5497238
复制相似问题