tamaño - Reemplazando varchar2 con un tipo de datos más grande en Oracle SP
varchar2 oracle (1)
El tipo de datos long
está en desuso; si puede, debería considerar seriamente migrar su columna long
a una clob
.
Si estuvieras trabajando con un clob
, podrías anexar el límite varchar2
32k de la siguiente manera:
declare
l_clob clob;
begin
dbms_lob.createtemporary(l_clob, true);
dbms_lob.open(l_clob, dbms_lob.lob_readwrite);
dbms_lob.writeappend(l_clob, 4, ''1234'');
for i in 1..10000 loop
dbms_lob.writeappend(l_clob, 5, ''.5678'');
end loop;
dbms_output.put_line(''CLOB length: '' || length(l_clob));
dbms_lob.close(l_clob);
dbms_lob.freetemporary(l_clob); end;
/
CLOB length: 50004
Puede agregar un long
con el operador de concatenación ||
, pero como ya has visto, solo hasta 32k. No hay una manera fácil de manejar valores long
por encima de eso dentro de PL / SQL. Es posible que pueda hacer algo con dbms_sql
pero realmente no valdrá la pena el esfuerzo si existe la posibilidad de cambiar la columna de la tabla a una clob
.
Si desea pasar el clob nuevamente a la persona que llama, y es un clob temporal, tendrá que ser definido por la persona que llama y se le pasará después de que se haya creado:
create or replace procedure proc1 as
l_clob clob;
begin
dbms_lob.createtemporary(l_clob, true);
proc2(l_clob);
dbms_output.put_line(''proc1 CLOB length: '' || length(l_clob));
dbms_lob.freetemporary(l_clob);
end;
/
create or replace procedure proc2(p_clob in out clob) as
begin
dbms_lob.open(p_clob, dbms_lob.lob_readwrite);
dbms_lob.writeappend(p_clob, 5, ''12345'');
for i in 1..9999 loop
dbms_lob.writeappend(p_clob, 5, ''.56789'');
end loop;
dbms_output.put_line(''proc2 CLOB length: '' || length(p_clob));
dbms_lob.close(p_clob);
end;
/
exec procs;
proc2 CLOB length: 50000
proc1 CLOB length: 50000
De lo contrario, el objeto no existirá en lo que respecta a la persona que llama.
Si existe el clob
- seleccionado de una tabla, por ejemplo, para que no necesite la llamada createtemporary
- entonces puede asignarlo a un parámetro out
, pero no creo que sea el caso de lo que ha descrito.
Estoy usando Oracle verion 10. Hay un procedimiento almacenado en PL / SQL usando la variable varchar2. El código agrega constantemente la variable varchar2. Cuando el tamaño variable varchar2 excede 32767, no puede agregar más valor. Ahora quiero cambiar el tipo de datos a long o clob (para acomodar más caracteres), no funciona. ¿Cómo modificar el código aquí para tener la misma funcionalidad añadida con clob o long?
muestra que se agrega x: = x || ''mis datos'';