Página 1 de 1

copiar long raw

Enviado: Ter, 31 Mai 2005 3:07 am
por schnu
tenho uma tabela q tem o campo long raw, e dentro desse campo esta armazenado figuras, porem tenho outra tabela parecida q tb tenho um campo long raw, o que preciso fazer é passar as figuras q estao armazenadas na tabela 1, para a tabela 2, porem estou tendo difuculdades para lhe dar com os campos long raw, alguém sabe como posso resolver isso ??

Enviado: Ter, 31 Mai 2005 9:22 am
por dr_gori
faz um INSERT!
Exemplo:

Selecionar tudo

INSERT INTO tab1 (campo_long) (select campo_long from tabela2)
aí vai um link
http://glufke.net/oracle/viewtopic.php?t=154

Enviado: Seg, 06 Mar 2006 8:43 am
por gerson.vasconcelos
Caro Dr_Gori, isso aí de fato funciona, porém apenas para campos Blob, não para long raw. Estou com a mesma dificuldade do amigo, fazer cópia de campo long raw, porém não consegui encontrar uma solução ainda. Valeu pela dica, mas infelizmente ela não funciona.

Enviado: Seg, 06 Mar 2006 9:04 am
por dr_gori
Na verdade, se você está usando o banco 8 ou superior, você não deveria estar usando LONG RAW. Ele ainda existe apenas para fins de compatibilidade. Você deveria estar usando um BLOB! (daí funciona da forma que foi indicada)

Para copiar de uma tabela pra outra um campo LONG RAW apenas com pl/sql, é meio complicado:
* faça um export da tabela.
* renomeie a tabela para o nome desejado usando o comando RENAME
* faça o import que você recem criou...

Veja o que o Tom Kyte fala a respeito:
http://asktom.oracle.com/pls/ask/f?p=49 ... 8223421081

Este cursor pode ser usado caso o long raw tenha até 32k

Selecionar tudo

DECLARE
CURSOR MyCursor IS SELECT Field1, Field2, RawField FROM Table1; 
vField1 integer;
vField2 varchar2(50);                                                            

  
vRawField long raw;
iCount integer;
BEGIN
iCount := 0;

OPEN MyCursor;

LOOP
FETCH MyCursor INTO vField1, vField2, vRawField; 
EXIT WHEN MyCursor%NOTFOUND;
iCount := iCount + 1;   
INSERT INTO Table2 (T2Field1, T2Field2, T2RawField) 
VALUES (vField1, vField2, vRawField); 

--Commit every 10 rows 
IF iCount = 10 THEN             
iCount := 0; 
COMMIT;
END IF;

END LOOP; 
COMMIT;   
CLOSE MyCursor;  
END;

Esta rotina é feita em JAVA, mas creio que não está 100% testada.

Selecionar tudo

ops$tkyte@ORA9IR2> create or replace and compile java source named "long_raw" as
  2  import java.io.*;
  3  import java.lang.*;
  4  import java.sql.*;
  5  import java.util.*;
  6  import oracle.jdbc.driver.*;
  7  import java.math.*;
  8
  9  public class long_raw
 10  {
 11      public static java.math.BigDecimal getlength(java.lang.String p_query, 
oracle.sql.ARRAY p_binds) throws Exception
 12      {
 13                  int length;
 14                  int tot_length = 0;
 15                  Connection conn = 
DriverManager.getConnection("jdbc:default:connection:");
 16                  PreparedStatement pstmt = conn.prepareStatement(p_query);
 17                  String[] binds = (String[])p_binds.getArray();
 18                  for( int i = 0; i < p_binds.length(); i++ )
 19                  {
 20                          pstmt.setString( i+1, binds[i] );
 21                  }
 22          ResultSet rset = pstmt.executeQuery();
 23
 24                  if ( rset.next() )
 25          {
 26              InputStream is = rset.getBinaryStream(1);
 27                  byte buffer[] = new byte[1024];
 28              while ((length = is.read (buffer,0,1024)) != -1)
 29                                  tot_length += length;
 30              is.close();
 31          }
 32          rset.close();
 33                  pstmt.close();
 34                  return new java.math.BigDecimal( tot_length );
 35      }
 36  }
 37  /
 
Java created.
 
ops$tkyte@ORA9IR2> show error
No errors.
ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> create or replace function long_raw_length( p_query in 
varchar2, p_binds in strArray ) return number
  2  as language java
  3  name 'long_raw.getlength( java.lang.String, oracle.sql.ARRAY ) return 
java.math.BigDecimal';
  4  /
 
Function created.
 
ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> drop table t;
 
Table dropped.
 
ops$tkyte@ORA9IR2> create table t ( x int, y int, z long raw );
 
Table created.
 
ops$tkyte@ORA9IR2> insert into t values ( 1, 2, '0a0a0a0a' );
 
1 row created.
 
ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> select x, y, long_raw_length('select z from t where x = ? and 
y = ?', strArray(x,y) ) lrl
  2    from t;
 
         X          Y        LRL
---------- ---------- ----------
         1          2          4
 
ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> select max( long_raw_length('select piece from sys.idl_ub1$ 
where obj#=to_number(?) and part=to_number(?) and
  2  version=to_number(?) and piece# = to_number(?)', 
strArray(obj#,part,version,piece#) ) ) from sys.idl_ub1$;
 
 
MAX(LONG_RAW_LENGTH('SELECTPIECEFROMSYS.IDL_UB1$WHEREOBJ#=TO_NUMBER(?)ANDPART=T
-------------------------------------------------------------------------------
                                                                          32767






Re: copiar long raw

Enviado: Qui, 17 Mar 2022 4:03 pm
por madriano74
Assim:

Selecionar tudo

INSERT INTO tab1 (campo_long) (select to_lob(campo_long) from tabela2)