
set serveroutput on
set long 9999999
set pagesize 1000
set linesize 200
-- ============================================================================
-- Profile especializado para el lab de SELECT AI con annotations
-- ============================================================================
-- Este profile limita el contexto de SELECT AI a las tres tablas del ejercicio.
-- La opcion annotations=true envia las annotations de tablas y columnas al modelo.
-- enforce_object_list=true evita que el modelo use otras tablas accesibles.

BEGIN
  DBMS_CLOUD_AI.DROP_PROFILE(
    profile_name => 'PROFILE_GPT_5_5_SELECTAI',
    force        => TRUE
  );
END;
/

BEGIN
  DBMS_CLOUD_AI.CREATE_PROFILE(
    profile_name => 'PROFILE_GPT_5_5_SELECTAI',
    attributes   => JSON_OBJECT(
      'provider'            VALUE 'oci',
      'credential_name'     VALUE 'OCI$RESOURCE_PRINCIPAL',
      'model'               VALUE 'openai.gpt-5.5',
      'region'              VALUE 'us-chicago-1',
      'oci_compartment_id'  VALUE 'ocid1.compartment.oc1..aaaaaaaa33ogmhasyvcqzuvkrfzo5mavh3q2le7mgwmy74yzpyqi7byxgrlq',
      'temperature'         VALUE 1,
      'max_tokens'          VALUE 8192,
      'annotations'         VALUE 'true',
      'object_list_mode'    VALUE 'all',
      'enforce_object_list' VALUE 'true',
      'object_list'         VALUE JSON_ARRAY(
        JSON_OBJECT('owner' VALUE USER, 'name' VALUE 'T_ROOT'),
        JSON_OBJECT('owner' VALUE USER, 'name' VALUE 'T_COMERCIOS'),
        JSON_OBJECT('owner' VALUE USER, 'name' VALUE 'T_BENEFICIOS_POR_NIVEL')
      )
    ),
    description  => 'Profile para SELECT AI usando annotations y solamente T_ROOT, T_COMERCIOS y T_BENEFICIOS_POR_NIVEL.'
  );
END;
/

-- ============================================================================
-- Lab: Consultas SELECT AI usando annotations
-- ============================================================================
-- Este script contiene ejemplos didacticos de SELECT AI.
--
-- La accion SHOWSQL muestra el SQL que el modelo genera. Esto ayuda a ver como
-- las annotations de display_name, business_description, synonyms y
-- relationship_hint guian la seleccion de tablas, columnas y joins.


-- SELECT AI modes:
-- showsql:    cuando quieres obtener el SQL generado, revisarlo, auditarlo, registrarlo en logs o ejecutarlo después con control propio.
-- runsql:     cuando aceptas que la base de datos genere y ejecute la consulta directamente.
-- narrate:    cuando quieres una respuesta en lenguaje natural basada en el resultado.
-- explainsql: cuando quieres explicar el SQL generado.
-- chat:       conversación general con el modelo, no necesariamente sobre SQL.

-- ============================================================================

EXEC DBMS_CLOUD_AI.SET_PROFILE('PROFILE_GPT_5_5_SELECTAI');

-- ============================================================================
-- Ejemplo 1: sinonimos de comercios y categorias
-- ============================================================================
-- Las annotations indican que T_COMERCIOS representa "Comercios participantes"
-- y que NAME tambien puede ser entendido como tienda, local, merchant o comercio.
-- El prompt usa lenguaje de negocio, no nombres tecnicos de columnas.

-- select ai
SELECT AI runsql Muestra los locales participantes por rubro, indicando el comercio, la categoria y la procesadora de pago.;


SELECT JSON_SERIALIZE(
          DBMS_CLOUD_AI.GENERATE(
            prompt       => 'Muestra los locales participantes por rubro, indicando el comercio, la categoria y la procesadora de pago.',
            profile_name => 'PROFILE_GPT_5_5_SELECTAI',
            action       => 'runsql'
          ) returning CLOB pretty);

-- ============================================================================
-- Ejemplo 2: beneficio por segmento, compra minima y tope
-- ============================================================================
-- Las annotations explican que "nivel" tambien puede significar segmento o
-- categoria de cliente, y que "tope" es el reintegro maximo en guaranies.
-- El prompt usa esos sinonimos para mostrar como SELECT AI entiende el negocio.

SELECT AI runsql
  Para cada segmento de cliente, lista el porcentaje de reintegro,
  la compra minima requerida y el tope maximo de devolucion en guaranies.    
;

-- ============================================================================
-- Ejemplo 3: pregunta de negocio cruzando comercios y niveles
-- ============================================================================
-- Este ejemplo combina tres tablas. Las relationship_hint de T_ROOT, T_COMERCIOS
-- y T_BENEFICIOS_POR_NIVEL ayudan al modelo a entender que ambas listas hijas
-- pertenecen al mismo documento de promocion.

SELECT AI runsql
  Combine los comercios participantes con los beneficios por nivel de cliente del mismo documento.
  Muestra rubro, comercio, procesadora, nivel del cliente, porcentaje de reintegro, compra minima 
  y limite maximo de devolucion.    
;



