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; /