Eu tenho algumas tabelas que eu quero exportar. Estou usando este pacote (chamei de "CSV"): https://www.williamrobertson.net/documents/refcursor-to-csv.shtml
Consegui gravar em arquivos CSV antes de adicionar instruções CASE. Eu realmente espero que haja uma maneira de corrigi-lo porque minhas instruções CASE são super úteis.
O erro é:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.DBMS_SQL", line 2084
ORA-06512: at "C##USER1.CSV", line 38
ORA-06512: at "C##USER1.CSV", line 162
ORA-06512: at line 1
ORA-06512: at "C##USER1.CSV", line 278
ORA-06512: at "C##USER1.CSV", line 278
ORA-06512: at "C##USER1.EXPORT_02_PRODUCED_PURIFIED", line 5
ORA-06512: at "C##USER1.EXPORT_ALL_LYS_FOR_TABLEAU", line 5
Aqui é onde os erros apontam para:
ORA-06512: at "C##USER1.EXPORT_02_PRODUCED_PURIFIED", line 5
é aqui:
CREATE OR REPLACE VIEW vw_export_02_produced_purified AS SELECT
pk_purified_enz_id,
fk_construct_id as "fk_for_construct",
fk_expr_system as "expression_system",
CASE pr.valid
WHEN 1 THEN 'Yes'
WHEN 0 THEN 'No'
END as "Is this growth ok?",
g_batch,
p_batch,
pur.concentration as "Concentration (uM)",
pur.abts5_pur_checkpoint as "purification checkpoint",
pur.yield as "Yield (mg/L)",
CASE
WHEN pk_purified_enz_id IS NULL THEN ' '
WHEN pk_purified_enz_id IS NOT NULL THEN
buffer_mol || ' mM, ' ||
fk_final_buffer_system || ' ' ||
'pH ' || final_ph || ', ' ||
final_nacl || ' mM NaCl' ||
CASE
WHEN final_add IS NULL THEN ' '
WHEN final_add IS NOT NULL THEN ', ' || final_add
END
END AS "Purification Buffer",
buffer_mol,
fk_final_buffer_system as "buffer system",
final_ph,
final_nacl,
final_add as "other buffer additives"
FROM produced pr FULL OUTER JOIN purified_enz pur
on pr.pk_produced_id = pur.fk_produced_id;
CREATE OR REPLACE PROCEDURE EXPORT_02_PRODUCED_PURIFIED AS
l_dataset sys_refcursor;
begin
open l_dataset for select * from vw_export_02_produced_purified;
csv.write_file
( p_dataset => l_dataset
, p_heading => 'Y'
, p_directory => 'EXTRACT_DIR'
, p_filename => '02_produced_purified.txt' );
END EXPORT_02_PRODUCED_PURIFIED;
/
Este ORA-06512: at "C##USER1.EXPORT_ALL_LYS_FOR_TABLEAU", line 5
é do procedimento mestre que combina todos os procedimentos menores.
CREATE OR REPLACE PROCEDURE EXPORT_ALL_LYS_FOR_TABLEAU AS
BEGIN
EXPORT_00_CPP;
EXPORT_01_CONSTRUCT;
EXPORT_02_PRODUCED_PURIFIED;
EXPORT_03_CHAR;
EXPORT_04_CELL_DATA;
END EXPORT_ALL_LYS_FOR_TABLEAU;
/
DDL para tabelas referenciadas:
CREATE TABLE PRODUCED (
pk_produced_id NUMBER GENERATED ALWAYS AS IDENTITY,
fk_construct_id NUMBER NOT NULL,
g_batch VARCHAR2 (50) NOT NULL,
full_g_batch VARCHAR2 (200) GENERATED ALWAYS AS (g_batch || '-' || fk_construct_id) VIRTUAL,
valid NUMBER (1) DEFAULT 1,
fk_expr_system VARCHAR2 (50),
CONSTRAINT pk_produced_id PRIMARY KEY (pk_produced_id),
CONSTRAINT fk_p_construct_id FOREIGN KEY (fk_construct_id) REFERENCES construct (pk_construct_id),
CONSTRAINT fk_expr_system FOREIGN KEY (fk_expr_system) REFERENCES EXPR_SYSTEM(pk_expr_system),
CONSTRAINT uq_produced UNIQUE (fk_construct_id, g_batch)
);
CREATE TABLE PURIFIED_ENZ (
pk_purified_enz_id NUMBER GENERATED ALWAYS AS IDENTITY,
fk_produced_id NUMBER,
p_batch VARCHAR2 (50) NOT NULL,
pur_profile BLOB,
fk_final_buffer_system VARCHAR2 (50),
buffer_mol NUMBER (6, 2),
final_nacl NUMBER (4),
final_ph NUMBER (4, 2),
final_add VARCHAR2 (50),
yield NUMBER (6, 2),
concentration NUMBER (6, 2),
abts5_pur_checkpoint NUMBER (5, 2),
CONSTRAINT pk_purified_enz_id PRIMARY KEY (pk_purified_enz_id),
CONSTRAINT fk_produced_id FOREIGN KEY (fk_produced_id) REFERENCES produced (pk_produced_id),
CONSTRAINT fk_final_buffer_system FOREIGN KEY (fk_final_buffer_system) REFERENCES buffer_system (pk_final_buffer_system),
CONSTRAINT uq_purified_enz UNIQUE (fk_produced_id, p_batch)
);
A causa raiz - de acordo com seu rastreamento de pilha - está no DBMS_SQL, que é chamado pela linha 38 do seu pacote CSV. A linha 38 é a seguinte:
Não se trata de seus dados, mas sim do código da própria visualização. O que parece estar acontecendo é que uma definição de coluna ou alias em sua exibição é muito grande para ser processada pela chamada de procedimento.
Isso provavelmente não tem nada a ver com o limite geral de 4000 ou 32 K caracteres em construções varchar ou pl/sql, mas sim com uma restrição de tamanho variável específica dentro do procedimento describe_columns. Também pode estar relacionado à execução desse código em um banco de dados de contêiner em vez de um banco de dados conectável.
Usando sua tabela e visualização DDL, não consegui duplicar o erro em um PDB, então aconselho mover sua carga de trabalho para lá primeiro para ver se isso resolve seu problema. Se você continuar tendo problemas, eu abriria um ticket com o Suporte da Oracle, pois isso também pode indicar um bug.