tutorial ejemplos caracteristicas campo autoincremental 12c 11g oracle boolean

ejemplos - La falta de Oracle de un tipo de datos Bit para columnas de tabla



pl sql ejemplos (9)

Trabajo como desarrollador en un pequeño equipo de desarrollo, y algo me ha molestado hasta el punto de que he decidido actuar ...

Oracle no admite un tipo de datos de Bit, o de hecho cualquier otra cosa que tenga sentido obvio en escenarios de verdadero / falso. Sin embargo, sin desanimarse, antes de unirme al equipo, mis antepasados ​​decidieron usar los campos char (1) en su lugar, usando una letra específica para indicar sí / verdadero. Sin embargo, desafortunadamente, nuestra aplicación está acostumbrada a personas de todo el mundo, y por razones que desafían francamente todos mis intentos de comprensión, el valor utilizado varía según la localización.

Sí, sé que eso es totalmente innecesario para los valores en el back-end que el usuario nunca ve, sin embargo ...

Me he dado cuenta de que esta práctica parece estar avanzando hacia un nuevo desarrollo, lo que me parece una locura, por lo que estoy pensando en proponer un Número (1,0) para esto en su lugar: 0 se considera falso / no, todo lo demás se interpreta como verdad / si ...

Pregunta simple: ¿alguien puede pensar en una razón por la que esto podría ser una mala idea?

Mientras lo hacemos, ¿alguien sabe por qué Oracle no admite un tipo booleano simple? ¿No es una misión de GLARING?

Saludos en anticipación,

Martín.


Aquí hay una discusión de Ask Tom sobre el tema. Da una visión centrada en Oracle sobre el tema.

En cuanto al almacenamiento, char (1) es en realidad un poco más eficiente (sin juego de palabras):

SQL> CREATE TABLE xx (c CHAR(1), n NUMBER); Table created SQL> insert into xx values(''T'', 1); 1 row inserted SQL> select dump(c), dump(n) from xx; DUMP(C) DUMP(N) ------------------- ------------- Typ=96 Len=1: 84 Typ=2 Len=2: 193,2



El número (1) no es mejor que el char (1). Especialmente si será además del char existente (1). Eso solo aumentará la confusión.

FWIW, Oracle en vistas internas (como USER_TAB_COLUMNS) utiliza varchar2 (3) (YES y NO). Sin embargo, no estoy seguro si son 100% consistentes aquí.


La pregunta es antigua, pero hasta que se use la última versión de oracle, sigue siendo una pregunta válida.

Resolvería el problema de esta manera: cree una tabla que contenga los valores posibles para verdadero / falso más texto de pantalla localizado fe T $ PALABRAS CLAVE ITEMNO ITEMTEXT ITEMTEXT_FE ... 0 False Falsch 1 True Wahr

En lugar de Verdadero / Falso, esto también podría ser Seleccionado, No Seleccionado, etc.

Y luego agregue una clave de Foreigh a su columna en esta tabla. De esa manera solo tiene valores válidos y no cambian con la localización.

Otra buena solución es que imho está usando una restricción de verificación en su columna de datos. Esta ofc no funciona si sus valores podrían ser diferentes en la misma base de datos / columna, dependiendo de la localización de los clientes.

alter table tblLocations add flag number CONSTRAINT <constraintname> CHECK (flag IN (1,0));


No soy un nativo de inglés, así que tiendo a usar 1 y 0 o ''1'' y ''0''. Usar ''Y'' y ''N'' no tiene mucho sentido si no está codificando en inglés (sí, existe la codificación en el idioma nativo). El uso de ''SI'' y ''NO'' o ''S'' y ''N'' no parece profesional (como nombrar variables con letras acentuadas). Unos y ceros, por el contrario, son bastante estándar si has codificado en C, PHP o JavaScript. En cualquier caso, siempre agrego la restricción apropiada para no permitir ningún otro carácter. Aparte de los problemas subjetivos, no creo que haya una mejora notable en el rendimiento al elegir CHAR o NUMBER. Me gustan los números un poco más porque no necesito citarlos :)

Estoy de acuerdo en que es una omisión evidente, pero he leído discusiones acaloradas sobre el tema en algunos foros de Oracle; Es una especie de tema religioso. Algunos afirman que los booleanos pertenecen a tipos de datos de aplicaciones y no tienen lugar en el núcleo de la base de datos. Honestamente, creo que es una de esas cosas que llevamos tanto tiempo sin ella, que es mejor que digamos que fue por razones.

Por cierto, MySQL tiene un tipo BOOLEAN pero es un sinónimo de TINYINT (1) por lo que eventualmente es igual a 1 y 0; lo cual está bien, porque también tiene las constantes VERDADERO y FALSO que evalúan a 1 y 0.


Oracle utiliza internamente "bits" (no un tipo de datos per se) en diferentes vistas del Diccionario de Datos.

Por ejemplo, la vista dba_users tiene:

.. , DECODE (BITAND (u.spare1, 128), 128, ''YES'', ''NO'') .. , DECODE (BITAND (u.spare1, 256), 256, ''Y'', ''N'') ..

lo que muestra una forma de solucionar esto de una manera. Si no tiene que modificar los bits "booleanos" a menudo, podría emplear el mismo enfoque que Oracle tenía desde Oracle 6 (al menos). Cree una tabla con una columna NÚMERO y una VISTA encima de eso que oculta la complejidad de las operaciones BITAND.

PD. En una nota al margen, Oracle JDBC tiene un tipo de datos "Bit" https://docs.oracle.com/cd/E16338_01/appdev.112/e13995/oracle/jdbc/OracleTypes.html#BIT así como usted ya sabe PL / SQL tiene Boolean. Aunque probablemente no te ayude mucho. Vea el enfoque de BITAND arriba si se ajusta a su caso.


Prefiero char (1) sobre número (1), ya que con una selección razonable de caracteres, es obvio qué personaje tiene qué significado booleano.

Por supuesto, debe combatir todas las diferentes variaciones, elija una y asegúrese de usarla poniendo restricciones de verificación en las columnas.

Aunque probablemente sea demasiado tarde en su caso, generar el esquema a partir de otra herramienta a menudo resuelve al menos el problema de la coherencia. Personalmente prefiero hibernar para este propósito, pero eso es muy específico de la situación.

Y, por supuesto, eso es una objeción flagrante. Para empeorar las cosas, PL / SQL tiene un valor booleano, pero no puede usarlo en sentencias de SQL.


Use un CHAR (1) y una restricción para permitir solo ''1'' y ''0''.

...

col CHAR(1), CONSTRAINT cons_atable_col1 CHECK (col1 IN (''1'',''0''))


https://docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html

Como dijo DCookie, char (1) es más eficiente. Debido a que VARCHAR2 (VARCHAR) vacío contiene 1 byte, pero cuando almacenamos 1 carácter, vaciamos 1 byte tamaño + con carácter 1 byte tamaño -> 2 bytes necesitamos almacenar 1 carácter en varchar