par , 09/12/2015 à 09h52 (2094 Affichages)
D'après mon expérience modeste, de plus d'une décennie, dans le développement sous PL/SQL et l'administration de base de données Oracle, je trouve que le type LONG est difficile à le manipuler, surtout en termes de conversion vers les types « LOB », ainsi de création de snapshot...
Je vous présente cet article qui expose une astuce sur la conversion de type LONG en type CLOB, et dans la même base de données, et dans une base de données distante.
La seul fonction que la trouve utile, c'est bien la fonction TO_LOB, mais cette fonction on ne peut être utilisée que dans :
- Le mode de création d'une table sous la syntaxe
1 2
| create table New_table as
setelct col1, to_lob(col_long) col2 from La_table |
- Ou le mode d’insertion sous la syntaxe :
1 2
| Insert into New_table
setelct col1, to_lob(col_long) col2 from La_table |
- Ou dans les creations des snapshots sous la syntaxe
1 2
| create table materialized view (ou snapshot) New_MV as
setelct col1, to_lob(col_long) col2 from La_table |
Ces trois méthodes fonctionnent si on est dans une base de données locale. Autrement dit, ça ne marche pas si on est dans base de données distante. Et en plus, la seule fonction qu’on peut l’utiliser dans une interrogation pour faire une conversion est dbms_metadata_util.long2clob qui elle-même ne marche pas si la base de données est distante.
A cet effet, j'ai créé une fonction simple générique qui aide à convertir de type LONG en type CLOB, quel que soit la nature de la base de données, locale ou distante.
1 2 3 4 5 6 7 8
| create or replace function z_test(p_table varchar2, p_col_long varchar2,p_rowid varchar2) return clob is
Result long;
begin
execute immediate 'select '|| p_col_long||
' from '||p_table||
' where rowid='''||p_rowid||'''' into Result;
return(Result);
end; |
Exemple de l’exécution :
Base de données locale :
select t.sowner,(z_test('snap$','query_txt',rowid))||'lkmlkmlkmlk',t.vname from snap$ t;
Base de données distante :
1 2
| select t.no_da,z_test('gxartida@tech.world','DESIGNAT_ARTICLE',rowid) from gxartida@tech.world t;
select t.sowner,(z_test('sys.snap$@tech.world','query_txt',rowid)),t.vname from sys.snap$@tech.world t; |