Convertendo LONG para VARCHAR2 ou CLOB

Neste post irei demonstar como criar uma function para converter o valor de uma coluna LONG para VARCHAR2 ou então CLOB. Esse script utiliza SQL Dinâmico, ou seja, poderão utilizar para qualquer coluna, tabela, owner. Veja o script abaixo.

CREATE OR REPLACE FUNCTION UJP.fn_long_to_clob
(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_clob; --OU ENTAO V_MAX

END;

Foi feito uma consulta nas linhas 20 a 27 apenas para pegar o tamanho do LONG que iremos trabalhar. Nas linhas seguintes foi feito um SQL Dinâmico para retornar o valor do LONG nas linhas 33 a 41. A função column_value_long do pacote dbms_sql pega o valor da coluna long e coloca em uma variável do tipo VARCHAR2, que foi a variável v_max no nosso caso. A variável v_tamanho serve apenas para informar o tamanho retornado, algo que já conhecido e armazenado na variável v_length.

As linhas finais, da 43 a 46 nos dá duas opções. Ou de retornar a variável como VARCHAR2, a v_max, ou então um CLOB. Para isto, é inicializado a variável CLOB com o conteúdo de v_max, dessa maneira, fica a nossa escolha o que retornar. Claro, alterando a procedure para retornar o tipo de arquivo escolhido.

É algo bastante simples, mas muito útil em ambientes de desenvolvimento.

Anúncios

Formado em Ciências da Computação pela UFPB com experiência em Servidores Windows Server e Linux e banco de dados Oracle desde 2008 juntamente com os seus serviços. Desenvolvimento de Sistemas em Java SE com banco de dados Oracle e MySQL. Certificado Oracle Certified SQL Expert, mantendo o blog https://oraclepress.wordpress.com/ reconhecido pela OTN, articulista na OTN, portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine.

Marcado com: , , ,
Publicado em PL/SQL

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Esse Blog é reconhecido pela
Certificações
Sou articulista
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Formado em Ciências da Computação pela UFPB com experiência em Servidores Windows Server e Linux e banco de dados Oracle desde 2008 juntamente com os seus serviços. Desenvolvimento de Sistemas em Java SE com banco de dados Oracle e MySQL. Certificado Oracle Certified SQL Expert, mantendo o blog https://oraclepress.wordpress.com/ reconhecido pela OTN, articulista na OTN, portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 55,932 Visualizações
%d blogueiros gostam disto: