TransWikia.com

Converter coluna do tipo LONG em VARCHAR2 no ORACLE - problema relacionado ao tamanho do valor da coluna do tipo LONG em relação ao VARCHAR2

Stack Overflow em Português Asked by moises.santos on January 5, 2021

CREATE OR REPLACE FUNCTION PRC_HAM_CONVT_LONG_VARCHAR2
( p_owner VARCHAR2, p_tabela VARCHAR2, p_coluna VARCHAR2, p_rowid UROWID    )RETURN VARCHAR2 IS

     v_cursor INTEGER; --cursor
     v_length INTEGER; --tamanho do long
     v_tamanho INTEGER; --tamanho do que foi retornado
     v_sql VARCHAR(2000); --stetament
     v_max VARCHAR2(32760); --variavel varchar2 com tamanho maximo do long
     v_clob CLOB; --variavel do tipo clob
     v_long LONG; --variavel do tipo long
     v_syscur SYS_REFCURSOR;

BEGIN
v_cursor := dbms_sql.open_cursor;

v_sql := 'SELECT '||p_coluna||' FROM '||p_owner||'.'||p_tabela||' WHERE ROWID = :row_id';

OPEN v_syscur FOR v_sql USING p_rowid;
FETCH v_syscur INTO v_long;
v_length := LENGTH(v_long);
CLOSE v_syscur;    
dbms_sql.parse(v_cursor,v_sql,dbms_sql.NATIVE);
dbms_sql.bind_variable(v_cursor,'row_id',p_rowid);
dbms_sql.define_column_long(v_cursor,1);    

IF(dbms_sql.execute_and_fetch(v_cursor) = 1) THEN
   dbms_sql.column_value_long( v_cursor, 1, v_length, 0, v_max, v_tamanho );
END IF;  

dbms_lob.createtemporary(v_clob, FALSE, dbms_lob.CALL);
v_clob := v_max;

RETURN v_max; --OU ENTAO V_MAX

END;

Com essa função acima do Oracle consigo converter uma coluna do tipo LONG normalmente para VARCHAR2, porém, existem casos em que o valor da coluna LONG ultrapassa a faixa permitida do VARCHAR2 o que inevitavelmente causa um erro, como eu poderia fazer para resolver esse problema? Ou seja, fazer com que todo o valor da coluna LONG seja convertida para VARCHAR2?

One Answer

tl;dr
Acredito que não é possível.


A pergunta, base é, por que precisa ser varchar2? Esse tipo armazena somente 4000 bytes1, enquanto o LONGno máximo 2GB, logicamente a conversão iria perder dados, pois não "cabe" a quantidade de informações em um varchar2.

Sugiro que:

  • Trabalhe com esse tipo de dados na aplicação que esta desenvolvendo;
  • Cortar a quantidade caracteres no limite do varchar2;
  • Algum procedimento técnico criativo. gambiarra . (não recomendado)

1 Tamanho máximo: 4000 bytes ou 32767 bytes se o MAX_STRING_SIZE parâmetro de inicialização estiver definido como EXTENDED. Fonte: Oracle - Datatype Limits 12c

Answered by David on January 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP