miércoles, 29 de abril de 2026

El caso de la longitud de las contraseñas en Oracle AI Database 26ai: “Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”

 

En Oracle Database un VARCHAR2(4000) puede almacenar hasta 4000 bytes o hasta 4000 caracteres, dependiendo de cómo fue definida la columna y del parámetro NLS_LENGTH_SEMANTICS.

Pero lo que si estamos casi de acuerdo, es que serían un poco más o menos de 4000 bytes. Esto es una verdad absoluta que no permite discusión, cierto? Pues no.

Filosóficamente, podrías usar este caso para ilustrar la diferencia entre verdad absoluta, verdad formal y verdad contextual.

La afirmación dogmática sería:
“Un campo VARCHAR2(4000) almacena 4000.”

Presentada así, parece una verdad absoluta, casi axiomática. Pero en realidad es una proposición incompleta, porque omite la naturaleza de la unidad medida.

La verdad formal en Oracle sería: “Un VARCHAR2(4000) almacena hasta 4000 unidades de longitud definidas como BYTE o CHAR.”

Y la verdad contextual añade: “En un charset multibyte, 4000 caracteres pueden requerir muchos más bytes; por tanto, la capacidad efectiva en caracteres puede reducirse incluso a una cuarta parte.”

Ejemplo con AL32UTF8 y caracteres de 4 bytes (como muchos emojis): límite declarado: 4000 bytes
cada carácter consume 4 bytes, por tanto la capacidad real: 4000/4=10004000 / 4 = 10004000/4=1000, es decir, solo una cuarta parte de “caracteres” respecto a ASCII.

Desde la filosofía del lenguaje, esto recuerda a Ludwig Wittgenstein:

el significado depende del “juego del lenguaje”

“4000” no significa nada por sí mismo si no se especifica si hablamos de bytes o caracteres.

Desde Aristóteles, sería un problema de sustancia y accidente:
  • sustancia: la columna tiene límite 4000.
  • accidente: cómo se representa cada símbolo.
Desde Immanuel Kant, el “4000” sería el fenómeno percibido; la “cosa en sí” está condicionada por el charset.

Y desde una crítica al absolutismo epistemológico:

“Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”

En la base de datos de Oracle AI Database 26ai,

SQL> select BANNER_FULL from v$version;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0

SQL>
 
Existen 15 tablas con el nombre de la columna "PASSWORD".
  

SQL> select count(*) from dba_tab_columns
  2  where column_name='PASSWORD';

  COUNT(*)
----------
        15

Dos de los objetos más relevantes en donde se encuentra la columna "PASSWORD", si haz seguido mis lecturas durante estos años, son SYS.USER$ y DBA_USERS. En ambos objetos, el valor de precisión para la columna "PASSWORD" es de 4000 BYTES. Recuerden que ya para el set de caracteres que utilizamos normalmente en Latinoamérica las bases de datos modernas hacen una conversión de caracters a bytes.


SQL> desc sys.USER$
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USER#                                     NOT NULL NUMBER
 NAME                                      NOT NULL VARCHAR2(128)
 TYPE#                                     NOT NULL NUMBER
 PASSWORD                                           VARCHAR2(4000)
 DATATS#                                   NOT NULL NUMBER
 TEMPTS#                                   NOT NULL NUMBER
 CTIME                                     NOT NULL DATE
 PTIME                                              DATE
 EXPTIME                                            DATE
 LTIME                                              DATE
 RESOURCE$                                 NOT NULL NUMBER
 AUDIT$                                             VARCHAR2(38)
 DEFROLE                                   NOT NULL NUMBER
 DEFGRP#                                            NUMBER
 DEFGRP_SEQ#                                        NUMBER
 ASTATUS                                   NOT NULL NUMBER
 LCOUNT                                    NOT NULL NUMBER
 DEFSCHCLASS                                        VARCHAR2(128)
 EXT_USERNAME                                       VARCHAR2(4000)
 SPARE1                                             NUMBER
 SPARE2                                             NUMBER
 SPARE3                                             NUMBER
 SPARE4                                             VARCHAR2(1000)
 SPARE5                                             VARCHAR2(1000)
 SPARE6                                             DATE
 SPARE7                                             VARCHAR2(4000)
 SPARE8                                             VARCHAR2(4000)
 SPARE9                                             NUMBER
 SPARE10                                            NUMBER
 SPARE11                                            TIMESTAMP(6)
 SPARE12                                            NUMBER
 SPARE13                                            NUMBER
 SPARE14                                            NUMBER
 SPARE15                                            DATE
 SPARE16                                            VARCHAR2(4000)

SQL> desc sys.DBA_USERS
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                                  NOT NULL VARCHAR2(128)
 USER_ID                                   NOT NULL NUMBER
 PASSWORD                                           VARCHAR2(4000)
 ACCOUNT_STATUS                            NOT NULL VARCHAR2(32)
 LOCK_DATE                                          DATE
 EXPIRY_DATE                                        DATE
 DEFAULT_TABLESPACE                        NOT NULL VARCHAR2(30)
 TEMPORARY_TABLESPACE                      NOT NULL VARCHAR2(30)
 LOCAL_TEMP_TABLESPACE                              VARCHAR2(30)
 CREATED                                   NOT NULL DATE
 PROFILE                                   NOT NULL VARCHAR2(128)
 INITIAL_RSRC_CONSUMER_GROUP                        VARCHAR2(128)
 EXTERNAL_NAME                                      VARCHAR2(4000)
 PASSWORD_VERSIONS                                  VARCHAR2(17)
 EDITIONS_ENABLED                                   VARCHAR2(1)
 AUTHENTICATION_TYPE                                VARCHAR2(8)
 PROXY_ONLY_CONNECT                                 VARCHAR2(1)
 COMMON                                             VARCHAR2(3)
 LAST_LOGIN                                         TIMESTAMP(9) WITH TIME ZONE
 ORACLE_MAINTAINED                                  VARCHAR2(1)
 INHERITED                                          VARCHAR2(3)
 DEFAULT_COLLATION                                  VARCHAR2(100)
 IMPLICIT                                           VARCHAR2(3)
 ALL_SHARD                                          VARCHAR2(3)
 EXTERNAL_SHARD                                     VARCHAR2(3)
 PASSWORD_CHANGE_DATE                               DATE
 MANDATORY_PROFILE_VIOLATION                        VARCHAR2(3)
 PROTECTED                                          VARCHAR2(3)
 READ_ONLY                                          VARCHAR2(3)
 DICTIONARY_PROTECTED                               VARCHAR2(3)
 CLOUD_MAINTAINED                                   VARCHAR2(3)
 APPLICATION                                        VARCHAR2(3)
 MFA                                                VARCHAR2(9)

SQL>

Pero si revisamos la documentación oficial en Oracle.com, en Oracle AI Database 26ai, la longitud máxima del password es de 1024 bytes.

La columna esta definida para un tamaño más grande, pero sólo se pueden crear contraseñas con el tamaño máximo de 1024 bytes.

Veamos un ejemplo:

SQL> alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoS;

User altered.


SQL> alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSuper;
alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSuper
                                       *
ERROR at line 1:
ORA-28218: password length more than 1024 bytes
Help: https://docs.oracle.com/error-help/db/ora-28218/

Ven porque toda la explicación "innecesaria" que hice al puro principio de la publicación.?

“Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”


martes, 28 de abril de 2026

Tip rápido en Oracle Linux: Borraste archivos pero no logras ver el espacio disponible.?


[oracle@serverdb_01_prod]$ df -h
Filesystem                           Size  Used Avail Use% Mounted on
devtmpfs                             126G     0  126G   0% /dev
tmpfs                                126G  726M  125G   1% /dev/shm
tmpfs                                126G  2.6G  124G   3% /run
tmpfs                                126G     0  126G   0% /sys/fs/cgroup
/dev/sda3                            5.9T  2.6T  3.3T  44% /
/dev/sda1                            200M  7.4M  193M   4% /boot/efi
tmpfs                                 26G     0   26G   0% /run/user/1000
172.24.4.79:/FileSystem-RespaldosDB  8.0E  1.4T  8.0E   1% /respaldos
s3fs                                  64P     0   64P   0% /opt/app/respaldos_archive
tmpfs                                 26G     0   26G   0% /run/user/994

Ejecuta el comando SYNC y vuelve a validar.

[oracle@serverdb_01_prod]$ sync

[oracle@serverdb_01_prod]$ df -h
Filesystem                           Size  Used Avail Use% Mounted on
devtmpfs                             126G     0  126G   0% /dev
tmpfs                                126G  726M  125G   1% /dev/shm
tmpfs                                126G  2.6G  124G   3% /run
tmpfs                                126G     0  126G   0% /sys/fs/cgroup
/dev/sda3                            5.9T  2.6T  3.3T  44% /
/dev/sda1                            200M  7.4M  193M   4% /boot/efi
tmpfs                                 26G     0   26G   0% /run/user/1000
172.24.4.79:/FileSystem-RespaldosDB  8.0E  758G  8.0E   1% /respaldos
s3fs                                  64P     0   64P   0% /opt/app/respaldos_archive
tmpfs                                 26G     0   26G   0% /run/user/994

sábado, 25 de abril de 2026

Cómo crear embeddings desde SQL en Oracle AI Database 26ai usando modelos ONNX?





Para implementar modelos de Machine Learning en Oracle Database 23ai On-premises, el enfoque más moderno y potente es la importación de modelos en formato ONNX para habilitar AI Vector Search.

Qué es ONNX?
Significa Open Neural Network Exchange y corresponde un formato abierto y estándar para representar modelos de Machine Learning e Inteligencia Artificial, diseñado para que un modelo entrenado en una herramienta pueda ejecutarse en otra.

Si haces una conexión a tu base de datos y ejecutas el siguiente comando y no recibes ningún registro de vuelta, es que no tienes ningún modelo cargado en tu base de datos.

SELECT model_name, mining_function, algorithm 
FROM user_mining_models

Al ejecutar la siguiente consulta buscando crear un embedding para una línea de texto, vas a recibir un error ORA-40284 indicando que el modelo no existe.

SQL> SELECT VECTOR_EMBEDDING(MI_MODELO_EMBEDDINGS USING 'Hola, esto es una prueba' AS DATA) AS vector
FROM DUAL;  2
FROM DUAL
     *
ERROR at line 2:
ORA-40284: model does not exist
Help: https://docs.oracle.com/error-help/db/ora-40284/

Así que vamos a preparar nuestra base de datos para poder crear a través de la función VECTOR_EMBEDDING, una representación vectorial de un texto.

Lo primero, vamos a brindar los permisos necesarios al esquema en el cuál vamos a trabajar.
En este caso he escogido el esquema de ejemplo de SH.

GRANT DB_DEVELOPER_ROLE TO SH;
GRANT CREATE MINING MODEL TO SH;

Luego vamos a crear un directorio en nuestro servidor de base de datos, que va a hacer referencia a un punto en el sistema operativo, en donde vamos a descargar el modelo que queremos importar dentro de la base de datos.

create directory models as '/u01/app/oracle/models';

En este caso, el directorio "MODELS" apuntará a la ruta indicada a nivel de sistema operativo.

Ahora vamos a brindar permisos de lectura y escritura sobre el directorio creado a nuestro esquema SH.

grant read,write on directory models to sh;

Para este ejemplo es elegido el modelo all-MiniLM-L12-v2 que es uno de los modelos de embeddings más usados por su equilibrio entre tamaño, velocidad y precisión.

El modelo all_MiniLM_L12_v2.onnx es una versión exportada a ONNX del modelo Sentence Transformers sentence-transformers/all-MiniLM-L12-v2, utilizado principalmente para generar embeddings semánticos de texto. Es uno de los modelos que Oracle ha recomendado para integrarlo con AI Vector Search en Oracle AI Database 26ai.

Características técnicas principales

CaracterísticaValor aproximado
Arquitectura baseMiniLM (Transformer liviano)
Número de capas12 layers
Parámetros~33 millones
Dimensión del embedding384
Longitud máxima de tokens256 tokens (algunas implementaciones 128/256)
Tipo de salidaVector denso normalizado
Similaridad recomendadaCOSINE
FormatoONNX
LicenciaApache 2.0


¿Qué hace exactamente?

Convierte frases, párrafos o documentos cortos en vectores de 384 dimensiones donde: textos con significado similar → vectores cercanos textos distintos → vectores alejados

Ejemplo:
"Oracle Database 26ai supports vector search"
"Oracle AI DB includes semantic search"
ambos producirán embeddings cercanos.

Casos de uso típicos
Este modelo funciona bien para:

Semantic Search
Buscar documentos “por significado” y no por coincidencia exacta.

RAG (Retrieval-Augmented Generation)
Buscar fragmentos relevantes antes de enviar contexto a un LLM.

Clustering de texto
Agrupar tickets, incidentes, logs, correos.

Detección de similitud
Comparar preguntas/respuestas.

Clasificación semántica
Asignar categorías por cercanía vectorial.



Ventajas

Comparado con modelos más grandes como MPNet o BERT-base:
  • Más rápido en CPU.
  • Menor consumo de RAM.
  • Menor tamaño en disco (~90MB a ~130MB dependiendo de exportación).
  • Ideal para ejecutarse dentro de Oracle Database.
Ahora, será necesario que hagamos la descarga del modelo que hemos escogido para utilizar.

[oracle@oracle-server-26ai models]$ pwd
/u01/app/oracle/models

[oracle@oracle-server-26ai models]$ wget -O all_MiniLM_L12_v2.onnx \
"https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/iPX9W0MZeRkwJKWdFmdJCemmN-iKAl_bFvNGYLW7YqIrw4kKsukL24J2q93Beb9S/n/adwc4pm/b/OML-ai-models/o/all_MiniLM_L12_v2.onnx"

--2026-04-25 14:17:09--  https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/p/iPX9W0MZeRkwJKWdFmdJCemmN-iKAl_bFvNGYLW7YqIrw4kKsukL24J2q93Beb9S/n/adwc4pm/b/OML-ai-models/o/all_MiniLM_L12_v2.onnx
Resolving adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com (adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com)... 134.70.32.1, 134.70.28.1, 134.70.24.1
Connecting to adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com (adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com)|134.70.32.1|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 133322334 (127M) []
Saving to: ‘all_MiniLM_L12_v2.onnx’

all_MiniLM_L12_v2.onnx                      100%[========================================================================================>] 127.15M   310MB/s    in 0.4s

2026-04-25 14:17:09 (310 MB/s) - ‘all_MiniLM_L12_v2.onnx’ saved [133322334/133322334]

[oracle@oracle-server-26ai models]$ ls -lat
total 130200
drwxr-xr-x.  2 oracle oinstall        36 Apr 25 14:17 .
drwxrwx---. 10 oracle oinstall       118 Apr 25 14:15 ..
-rw-r--r--.  1 oracle oinstall 133322334 Oct  7  2025 all_MiniLM_L12_v2.onnx

Listo ya tenemos descargado nuestro modelo y ahora es necesario que carguemos el modelo dentro de la base de datos.

BEGIN
  DBMS_VECTOR.LOAD_ONNX_MODEL(
    directory => 'models',
    file_name => 'all_MiniLM_L12_v2.onnx',
    model_name => 'MI_MODELO_EMBEDDINGS'
  );
END;
/

Luego podemeos validar que el modelo efectivamente ha sido cargado.

SELECT model_name, mining_function, algorithm 
FROM user_mining_models

MODEL_NAME           MINING_FUNCTION                ALGORITHM
-------------------- ------------------------------ ------------------------------
MI_MODELO_EMBEDDINGS EMBEDDING                      ONNX

Ahora probemos a ver si es posible crear nuestro vector.

SELECT VECTOR_EMBEDDING(MI_MODELO_EMBEDDINGS USING 'Hola, esto es una prueba' AS DATA) AS vector
FROM DUAL;

[1.3900646E-003,6.4947255E-002,-3.41739021E-002,3.00823897E-002,-1.3453302E-002,-1.87666081E-002,-4.35688905E-002,4.46249396E-002,6.3403599E-002,-4.62511182E-002,3.3260759E-002,-1.44735333E-002,-2.21015308E-002,1.40913026E-002,7.5034E-002,3.59462239E-002,6.43426031E-002,1.98624283E-002,1.90574955E-002,-2.13727448E-002,7.24871606E-002,6.8553783E-002,-2.48328503E-002,2.43773255E-002,-2.34660842E-002,-5.5200249E-002,3.9385803E-002,7.0384331E-002,-5.28017692E-002,-5.48376963E-002,-1.94696989E-002,4.1839987E-002,7.37491548E-002,-2.21404079E-002,-5.96100725E-002,-4.02953289E-002,7.35913664E-002,-9.62668285E-002,1.56864934E-002,1.2650843E-001,-8.29633791E-003,-5.34933135E-002,-6.29290864E-002,-4.25488316E-002,2.33139982E-003,-1.02485389E-001,-3.00091389E-003,8.56035948E-002,7.16768205E-002,2.89637297E-002,2.96710469E-002,-4.93476242E-002,-3.28859203E-002,1.27376709E-002,4.25983733E-003,5.24660461E-002,7.47554079E-002,-9.9608168E-002,-6.88042492E-002,8.87526199E-002,-1.80443178E-003,2.61041019E-002,3.81092168E-002,6.49420405E-003,-7.15156458E-003,3.77375836E-004,6.56677037E-002,-5.78824989E-002,-2.22714376E-002,4.38990667E-002,3.11253797E-002,-1.50656011E-002,4.09434102E-002,5.47525883E-002,2.77292971E-002,-7.04061687E-002,1.6800079E-003,-9.08812806E-002,-8.92041251E-003,5.46105094E-002,-2.05046106E-002,-1.2373329E-001,-3.45300809E-002,-4.78763729E-002,-8.85539651E-002,-7.20430613E-002,-1.7484704E-002,4.76256311E-002,-3.64556946E-002,-6.55404404E-002,-5.06183552E-003,1.35141434E-002,-3.6078237E-002,-4.76635993E-004,3.7716683E-002,3.38687003E-002,-6.03729934E-002,-4.40221317E-002,1.00445992E-003,6.26754761E-002,1.9100951E-002,-4.17933352E-002,7.84236044E-002,-6.76141009E-002,-1.58108363E-003,8.11111853E-002,5.22661954E-002,3.96392047E-002,-7.88598787E-003,1.40044698E-002,-1.8102048E-002,-5.93436025E-002,-4.04904895E-002,4.09404673E-002,-3.24861035E-002,-1.36348559E-002,-7.20573664E-002,-3.92829888E-002,-7.74733722E-002,-6.04367889E-002,1.48849776E-002,-2.17362046E-002,-1.37405088E-002,-1.40654035E-002,5.28604463E-002,-8.58230144E-002,8.2690537E-002,-1.5872702E-002,2.59843729E-002,-1.89039744E-002,-4.1163303E-003,-3.26678306E-002,-5.90283051E-002,1.78802516E-002,-1.49752768E-002,6.13624938E-002,-2.13406868E-002,4.18959334E-002,-2.84545049E-002,2.55872235E-002,-1.41871767E-002,-7.05784326E-003,7.58661628E-002,5.12781693E-003,2.65482161E-002,-2.98756734E-002,6.20706081E-002,6.97502196E-002,-4.34035808E-002,6.63504153E-002,-1.63700934E-002,2.19134353E-002,-4.25044447E-002,-4.44938778E-004,-8.99366662E-002,-4.5101922E-002,-2.94682924E-002,6.38995096E-002,1.22462576E-002,-7.70974485E-003,-5.87149225E-002,3.07904016E-002,7.1540691E-002,-9.26405471E-003,3.59040033E-003,2.65567563E-003,-1.45466123E-002,3.51659209E-002,-6.44643903E-002,3.22895348E-002,-3.17530781E-002,8.62621609E-003,4.65120748E-002,-5.58609096E-003,-3.77367511E-002,4.18439917E-002,9.31436718E-002,-3.05033475E-002,-9.26166251E-002,1.64704993E-002,-2.0406669E-002,4.81320225E-004,-9.45158228E-002,-6.67981952E-002,-8.91887397E-002,2.49027461E-002,-6.48279041E-002,-4.72947806E-002,2.46572159E-002,5.50275706E-002,2.57982686E-002,-4.67213206E-002,-2.69834343E-002,8.45892653E-002,-5.38872145E-002,6.37916997E-002,5.9427578E-002,5.21879494E-002,-1.48437489E-002,-2.74545904E-002,-1.90172456E-002,2.9384179E-002,-8.22653249E-002,-2.33890284E-002,7.54830614E-002,-6.06272332E-002,5.65813715E-003,8.76496881E-002,-4.60354798E-002,-4.1076811E-003,2.31930427E-002,2.79998016E-002,-2.04425808E-002,1.55423552E-001,5.11384718E-002,1.07636675E-001,6.04426637E-002,1.50089845E-001,-5.39999828E-002,1.02401003E-001,3.16832936E-003,-6.32362515E-002,2.88271345E-002,-1.32585654E-032,1.38411419E-002,-5.69943376E-002,3.07825487E-002,-6.2084619E-002,4.73874994E-003,-5.29002324E-002,-6.90745264E-002,8.36086571E-002,7.66877756E-002,3.37841697E-002,-6.46747053E-002,-5.57038672E-002,7.92162195E-002,-8.3183445E-002,6.84358031E-002,1.10465817E-005,-4.53029294E-003,-2.83081327E-002,-2.04892661E-002,-9.35557634E-002,-5.7014741E-002,2.72388998E-002,7.82605112E-002,-1.20674539E-002,6.11994267E-002,9.75737348E-003,-3.0896483E-002,-3.74141373E-002,-2.18903963E-002,-7.92545453E-002,-8.68051965E-003,1.11484644E-003,-3.59221697E-002,1.31579891E-001,-1.28166946E-002,-2.35027988E-002,-1.26797035E-002,2.87881829E-002,4.12984751E-002,9.91139933E-003,-1.12441219E-002,1.65291037E-002,-9.90293324E-002,1.9596843E-002,-5.19916788E-002,-3.85330012E-003,1.16031997E-001,-3.30846384E-002,1.01698637E-002,-6.02884032E-002,-4.50805342E-003,2.04256666E-003,1.87034942E-002,5.2292333E-003,8.39919224E-002,-6.04134798E-002,-7.75140002E-002,-4.72206511E-002,4.50489484E-002,7.22124577E-002,2.7057562E-002,4.34556231E-002,-2.32761689E-002,-2.01885235E-002,3.4009587E-002,2.4763735E-002,-4.55132462E-002,1.18991081E-002,5.8908958E-002,7.33381808E-002,7.92638883E-002,-7.41918385E-002,-1.34471074E-001,-3.27881388E-002,-5.01030199E-002,5.87125532E-002,-9.05613378E-002,5.67616522E-003,-3.68121415E-002,-4.14253287E-002,3.20088374E-003,-2.77393535E-002,-8.57385434E-003,-4.5528993E-002,-4.96782809E-002,-2.40529813E-002,-1.36366487E-002,-7.79022556E-003,9.82291345E-003,5.79915568E-002,-9.82802012E-004,3.76926661E-002,-3.59502137E-002,-4.84997742E-002,-1.41461603E-002,4.12206343E-032,-2.22963225E-002,7.83920195E-003,-6.78976113E-003,2.47782543E-002,7.05694035E-002,3.58279049E-002,-6.50222152E-002,-6.46860227E-002,-1.02872102E-004,-3.98172028E-002,9.73907858E-003,-8.38956162E-002,-5.45164645E-002,-2.14765649E-002,3.25041562E-002,2.91623659E-002,4.62868623E-002,7.13896453E-002,2.59754043E-002,-1.16456635E-002,-1.39092626E-002,-7.8247726E-002,8.32773093E-003,-3.50259878E-002,4.80484255E-002,3.37976627E-002,-3.08791045E-002,-1.19398562E-002,6.18945323E-002,-9.94550586E-002,-9.02341772E-003,1.11277113E-002,-8.27196687E-002,-7.58799762E-002,1.68302748E-002,-6.02526218E-002,4.47138511E-002,-5.04813492E-002,-6.43555447E-002,-1.25823811E-001,-1.9547062E-002,7.96526521E-002,1.28585175E-002,2.31666751E-002,-2.69731451E-002,-5.82041442E-002,3.8045086E-002,-8.97646844E-002,3.40791396E-003,2.25604866E-002,-5.89550175E-002,-3.92772555E-002,7.14555234E-002,3.20473276E-002,8.6180523E-002,-3.58830206E-002,-1.6021559E-002,-2.47178948E-003,-4.43300009E-002,1.32946577E-002,8.7638922E-002,5.74000552E-002,-1.10163353E-002,1.13602327E-002]

Para el modelo all_MiniLM_L12_v2.onnx, la entrada principal esperada es: VARCHAR2.

Oracle hace conversiones automáticas desde otros tipos:
  • CHAR
  • NCHAR
  • NVARCHAR2
  • CLOB
  • NCLOB → convertido a NVARCHAR2
  • NUMBER, DATE, etc. → convertidos a texto si la conversión es válida
Ejemplo:
SELECT VECTOR_EMBEDDING(modelo USING employee_id) FROM hr.employees;

internamente sería algo similar a:  TO_CHAR(employee_id)

Restricciones
Aunque Oracle permita convertir: CLOB, no es recomendable si el contenido excede la ventana del modelo.

Ejemplo: MiniLM:
  • 256 tokens aprox.
  • algunos modelos 512
Si envías 20 páginas de texto, Oracle lo puede convertir, pero el modelo truncará internamente.
Eso puede degradar la semántica.

Ahora si, ya puedes desde tu base de datos crear "embeddings" para texto sin ncesidad de salir de la base de datos.


miércoles, 22 de abril de 2026

Oracle ACE Connect Costa Rica, 09 de mayo Universidad Cenfotec.

 


Hoy estamos viviendo un cambio silencioso, pero profundo, en la forma en que trabajamos con los datos.

Durante años hemos estructurado, normalizado y consultado información utilizando modelos relacionales tradicionales. Hemos sido expertos en responder preguntas exactas: ¿cuánto?, ¿cuándo?, ¿quién? Pero el mundo actual nos exige algo distinto.
 
Ahora necesitamos responder preguntas como:
• ¿qué se parece a esto?
• ¿qué significa esta imagen?
• ¿qué información relevante existe, aunque no esté explícitamente relacionada?

La inteligencia artificial está transformando la naturaleza del dato, y ya no hablamos solo de filas y columnas, sino de contexto, similitud y significado. Imágenes, documentos, registros médicos, diagramas, evidencia visual… todos contienen información valiosa que antes quedaba fuera del alcance del SQL tradicional.

Inscripción gratuita https://lnkd.in/ecpKn8jw
Habrá parqueo disponible y refrigerio.


martes, 21 de abril de 2026

Actualización crítica de parches de Oracle para abril de 2026


21 de abril de 2026
Actualización crítica de parches de Oracle para abril de 2026

Estimado cliente de Oracle:

La actualización crítica correspondiente a abril de 2026 se publicó el 21 de abril de 2026.

Oracle recomienda encarecidamente aplicar los parches lo antes posible.

El aviso está disponible en la siguiente ubicación:
https://lnkd.in/e6bZgv3j

Puede encontrar recursos adicionales de seguridad de Oracle en los siguientes enlaces:
https://lnkd.in/eUUcqB9i
https://lnkd.in/eruhdAuA
https://lnkd.in/eUdy_yrP

Las próximas cuatro fechas para las actualizaciones de parches críticos son:

21 de julio de 2026
20 de octubre de 2026
19 de enero de 2027
20 de abril de 2027

Si no puede determinar si necesita una actualización de software o cómo aplicarla, póngase en contacto con el soporte técnico de Oracle.

Gracias,
Seguridad de Oracle

domingo, 5 de abril de 2026

Quality: característica de Oracle AI Database 26ai que te facilita la existencia.

 

Cláusula QUALITY

Veamos como podemos solucionar un problema simple del día a día.

Definición del problema:
Necesitamos conocer, cuál es el empleado mejor pagado en cada departamento.?

Tomemos para este ejemplo la clásica tabla del esquema de ejemplos HR.EMPLOYEES.

Tradicionalmente en Oracle (hasta 19c/21c) este problema se podría haber solucionado de esta manera:

SELECT *FROM (
SELECT employee_id,
department_id,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
FROM hr.employees
)
WHERE rn = 1;

EMPLOYEE_ID DEPARTMENT_ID         RN
----------- ------------- ----------
        200            10          1
        201            20          1
        114            30          1
        203            40          1
        121            50          1
        103            60          1
        204            70          1
        145            80          1
        100            90          1
        108           100          1
        205           110          1
        178                        1

12 rows selected.

Explicación de la función analítica ROW_NUMBER()

PARTITION BY department_id ==> divide el conjunto de datos en grupos por departamento
ORDER BY salary DESC ==> ordena los empleados dentro de cada departamento desde el salario mayor al menor
ROW_NUMBER() ==> asigna una numeración secuencial empezando en 1 para cada grupo

Desde Oracle AI Database 26ai, existe una nueva cláusula que resulta especialmente relevante desde la perspectiva del lenguaje de programación SQL/PLSQL y el modelo de programción: QUALIFY (filtrado post-analítico sin subquery), que permite simplificar el filtrado de resultados de funciones analíticas (window functions) sin necesidad de realizar una subconsulta.

La consulta inicial se puede expresar directamente en 26ai de la siguiente manera:

SELECT employee_id,
           department_id,
           ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
FROM hr.employees
QUALIFY rn = 1;

EMPLOYEE_ID DEPARTMENT_ID         RN
----------- ------------- ----------
        200            10          1
        201            20          1
        114            30          1
        203            40          1
        121            50          1
        103            60          1
        204            70          1
        145            80          1
        100            90          1
        108           100          1
        205           110          1
        178                        1

12 rows selected.

La cláusula QUALIFY filtra el resultado después de calcular la función analítica.

Relevancia técnica
Desde la perspectiva del optimizador:
  • elimina subqueries artificiales
  • mejora legibilidad declarativa
  • facilita generación automática de SQL por LLMs
  • simplifica pipelines de analytics y feature engineering
Oracle posiciona QUALIFY como el equivalente analítico de HAVING, pero aplicado a funciones window.

Este tipo de mejora suele pasar desapercibida frente a AI Vector Search, pero impacta directamente el diseño de consultas complejas, especialmente en:

scoring de fraude
ranking de embeddings
top-K similarity search
deduplicación basada en ventanas

A nivel del plan de ejecución podemos ver que ambas consultas a pesar de brindar el mismo resultado, no son equivalentes de cara al optimizador, aunque a nivel de costo, son equivalentes.

[oracle@oracle-server-26ai ~]$ sqlplus /nolog

SQL*Plus: Release 23.26.1.0.0 - Production on Mon Apr 6 02:50:48 2026
Version 23.26.1.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

SQL> connect einsten/oracle@pdb1
Connected.
SQL> set linesize 200
SQL> set pagesize 20
SQL> explain plan for
  2  SELECT *
FROM (
    SELECT employee_id,
           department_id,
           ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
    FROM hr.employees
)
WHERE rn = 1;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 2698234872

--------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |           |    11 |   220 |     4  (25)| 00:00:01 |
|*  1 |  VIEW                    |           |    11 |   220 |     4  (25)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK|           |   107 |  1177 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL     | EMPLOYEES |   107 |  1177 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("RN"=1)
   2 - filter(ROW_NUMBER() OVER ( PARTITION BY "DEPARTMENT_ID" ORDER BY
              "SALARY" DESC )<=1)

17 rows selected.

SQL> explain plan for
  2  SELECT employee_id,
           department_id,
           ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) rn
FROM hr.employees
QUALIFY rn = 1;

Explained.

SQL>  select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 2698234872

--------------------------------------------------------------------------------------
| Id  | Operation                | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |           |    11 |   242 |     4  (25)| 00:00:01 |
|*  1 |  VIEW                    |           |    11 |   242 |     4  (25)| 00:00:01 |
|*  2 |   WINDOW SORT PUSHED RANK|           |   107 |  1177 |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL     | EMPLOYEES |   107 |  1177 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("from$_subquery$_002"."sys_qualify$_h$_predex$_0"=TRUE)
   2 - filter(ROW_NUMBER() OVER ( PARTITION BY "DEPARTMENT_ID" ORDER BY
              "SALARY" DESC )<=1)

17 rows selected.

SQL>

Si observamos detenidamente, veremos que con el uso de la cláusula "QUALITY" el optimizador realiza un filtro en la creación de la vista con  "filter("from$_subquery$_002"."sys_qualify$_h$_predex$_0"=TRUE)
  • from$_subquery$_002: Es un alias interno generado por Oracle para una subconsulta (inline view) que el optimizador ha creado o transformado para procesar la lógica de tu SQL.
  • sys_qualify: Se refiere a la operación de filtrado sobre funciones de ventana. En versiones recientes de Oracle (como la 23ai), se introdujo formalmente la cláusula QUALIFY de Oracle, que permite filtrar directamente por funciones analíticas.
  • _h$_predex$_0=TRUE: Es un predicado interno de "pre-ejecución" (predex). Indica que el optimizador ha determinado una condición que debe cumplirse (ser TRUE) para que las filas pasen a la siguiente etapa del plan.
Aquí lo importante de tener en cuenta, es la eliminación de la subconsulta y la simplificación de la misma.


Todos los Sábados a las 8:00PM