104 lines
3.8 KiB
SQL
104 lines
3.8 KiB
SQL
create or replace procedure prc_26ai_health_hemograma( p_id in number,
|
|
p_comp_id in varchar2,
|
|
p_credential in varchar2 default 'OCI_CRED')
|
|
as
|
|
/*
|
|
|
|
Criado por: fernando.leal@oracle.com
|
|
Data: Dez/2025
|
|
Objetivo: demonstrar casos de uso do Oracle AI Database 26ai
|
|
|
|
v1 - extrair chunks do hemograma para viabilizar a execucao da funcao de RAG. Tabela TMP: TB_26AI_HEALTH_HEMOGRAMA_TMP
|
|
|
|
*/
|
|
v_hemograma clob := empty_clob();
|
|
v_chunk VARCHAR2(32767);
|
|
v_offset INTEGER := 1;
|
|
v_chunk_size CONSTANT INTEGER := 10000; -- 10 KB
|
|
v_length INTEGER;
|
|
v_has number;
|
|
begin
|
|
|
|
select count(1)
|
|
into v_has
|
|
from TB_26AI_HEALTH_HEMOGRAMA_TMP
|
|
where id = p_id;
|
|
|
|
if v_has = 0 then
|
|
|
|
select replace(replace(replace(replace( dbms_vector_chain.utl_to_text( dt.file_content ) ,chr(10),' '),chr(13),' '),'"',''),'''','')
|
|
into v_hemograma
|
|
from TB_26AI_HEALTH_HEMOGRAMA dt
|
|
where id = p_id;
|
|
|
|
-- Tamanho total do texto
|
|
v_length := dbms_lob.getlength(v_hemograma);
|
|
|
|
-- Loop em blocos de 10KB
|
|
WHILE v_offset <= v_length LOOP
|
|
|
|
v_chunk := dbms_lob.substr(
|
|
v_hemograma,
|
|
v_chunk_size,
|
|
v_offset
|
|
);
|
|
|
|
insert into TB_26AI_HEALTH_HEMOGRAMA_TMP
|
|
WITH dados AS (
|
|
SELECT FNC_26ai_RAG(
|
|
'##Você é um sistema de extração de dados laboratoriais.
|
|
##Tarefa:
|
|
A partir do texto bruto de um laudo de exames laboratoriais, extraia SOMENTE os exames realizados e seus respectivos valores numéricos com unidades.
|
|
##Regras obrigatórias:
|
|
1. Retorne exclusivamente um objeto JSON, e nunca use Markdown como ```json .
|
|
2. Cada chave deve ser o nome do exame (em português, da mesma maneira que esta no hemograma original).
|
|
3. Cada valor deve conter apenas o valor do exame + unidade, exatamente como apresentado no laudo.
|
|
4. Ignore completamente:
|
|
- Intervalos de referência
|
|
- Percentuais quando houver valor absoluto equivalente (priorize o valor absoluto)
|
|
- Dados do paciente, médicos, datas, assinaturas, métodos, gráficos, observações, textos legais e administrativos
|
|
- Repetições do mesmo exame (considere apenas o resultado mais recente)
|
|
5. Não faça interpretações clínicas.
|
|
6. Não normalize valores nem converta unidades.
|
|
7. Não inclua textos explicativos.
|
|
8. Não agrupe exames — cada exame deve ser uma entrada independente.
|
|
9. Caso um exame possua mais de uma medida válida (ex: percentual e absoluto), utilize o valor absoluto com unidade.
|
|
##Formato de saída (exemplo):
|
|
{
|
|
"exames": [
|
|
["eritrocitos", "4,65 10^6/µL"],
|
|
["hemoglobina", "14,8 g/dL"],
|
|
["hematocrito", "43,8 %"],
|
|
["vcm", "94,3 fL"]
|
|
...
|
|
]
|
|
}
|
|
##Texto de entrada:' || v_chunk, p_credential, p_comp_id ) json_text
|
|
)
|
|
SELECT
|
|
p_id,
|
|
v('APP_SESSION'),
|
|
current_timestamp,
|
|
v_chunk,
|
|
jt.exame_nome,
|
|
jt.exame_valor
|
|
FROM dados d,
|
|
JSON_TABLE(
|
|
d.json_text,
|
|
'$.exames[*]'
|
|
COLUMNS (
|
|
exame_nome VARCHAR2(100) PATH '$[0]',
|
|
exame_valor VARCHAR2(100) PATH '$[1]'
|
|
)
|
|
) jt;
|
|
|
|
v_offset := v_offset + v_chunk_size;
|
|
|
|
END LOOP;
|
|
|
|
end if; -- if v_has = 0 then
|
|
|
|
commit;
|
|
|
|
end;
|
|
/ |