2010-06-04 6 views
12

Nous avons une table dans Oracle 11g avec une colonne varchar2. Nous utilisons un langage de programmation propriétaire dans lequel cette colonne est définie comme une chaîne. Maximum, nous pouvons stocker 2000 caractères (4000 octets) dans cette colonne. Maintenant, l'exigence est telle que la colonne doit stocker plus de 2000 caractères (en fait, des caractères illimités). Les DBA n'aiment pas les types de données BLOB ou LONG pour des raisons de maintenance.Comment stocker des caractères illimités dans Oracle 11g?

La solution que je peux penser est de supprimer cette colonne de la table d'origine et d'avoir une table séparée pour cette colonne, puis de stocker chaque caractère dans une rangée, afin d'obtenir des caractères illimités. Ce tableau sera joint à la table d'origine pour les requêtes.

Y a-t-il une meilleure solution à ce problème? MISE À JOUR: Le langage de programmation propriétaire permet de définir des variables de type chaîne et BLOB, il n'y a pas d'option de CLOB. Je comprends les réponses données, mais je ne peux pas accepter les DBA. Je comprends que dévier de BLOB ou LONG sera le cauchemar des développeurs, mais ne peut toujours pas l'aider. MISE À JOUR 2: Si le maximum dont j'ai besoin est de 8000 caractères, puis-je ajouter 3 colonnes supplémentaires de sorte que j'aurai 4 colonnes de 2000 caractères chacune pour obtenir 8000 caractères. Ainsi, lorsque la première colonne est pleine, les valeurs seraient transférées à la colonne suivante et ainsi de suite. Ce design aura-t-il de mauvais effets secondaires? Veuillez suggérer.

+15

Cela ressemble à une histoire DailyWTF se déroule sous nos yeux ... –

+1

Eh bien, si vous dites à vos DBA que c'est ce que vous allez faire, alors je suis sûr qu'ils seraient prêts à reconsidérer BLOB ou LONG. Rien à éviter :) –

+1

En tant que développeur junior, j'ai eu la même situation et j'ai été forcé d'utiliser une série de lignes nvarchar mappées l'une après l'autre. La logique d'insertion et de mise à jour était si complexe que la couche d'application prenait un mal de tête de maintenance bien pire que ce qu'aurait été la céphalée dba. – dkackman

Répondre

1

BLOB est la meilleure solution. Tout le reste sera moins pratique et un plus grand désagrément d'entretien.

2

Vous avez dit non BLOB ou LONG ... mais qu'en est-il de CLOB? Données de caractères de 4 Go.

12

Si un blob est ce dont vous avez besoin pour convaincre votre dba c'est ce dont vous avez besoin. Ces types de données sont là pour une raison et rouler votre propre implémentation sera pire que le type intégré.

Aussi vous pouvez vouloir regarder le type CLOB car il répondra à vos besoins plutôt bien.

1

BFILE est-il un type de données alternatif viable pour vos administrateurs de base de données?

1

Je ne comprends pas. Un CLOB est le type de données de base de données approprié. Si votre langage de programmation bizarre traite des chaînes de caractères 8000 (ou autres), ce qui l'empêche de les écrire dans un CLOB. Plus précisément, quelle erreur obtenez-vous (d'Oracle ou de votre langage de programmation) lorsque vous essayez d'insérer une chaîne de 8000 caractères dans une colonne définie comme CLOB.

7

Vous pouvez suivre la manière dont Oracle a stocké ses procédures stockées dans le schéma d'informations. Définissez une table appelée colonnes de texte:

CREATE TABLE MY_TEXT (
IDENTIFIER INT, 
LINE  INT, 
TEXT  VARCHAR2 (4000), 
PRIMARY KEY (INDENTIFIER, LINE)); 

La colonne identifiant est la clé étrangère à la table d'origine. La ligne est un entier simple (pas une séquence) pour garder les champs de texte dans l'ordre. Cela permet de conserver des blocs de données plus importants

Oui, ce n'est pas aussi efficace qu'un blob, un clob, ou LONG (j'éviterais les champs LONG si possible). Oui, cela nécessite plus de mainenance, buf si vos DBA sont complètement opposés à la gestion des champs CLOB dans la base de données, c'est l'option deux.

EDIT:

my_table ci-dessous est l'endroit où vous avez actuellement la colonne VARCHAR vous cherchez à développer. Je voudrais le garder dans la table pour les champs de texte courts.

CREATE TABLE MY_TABLE (
INDENTIFER INT, 
OTHER_FIELD VARCHAR2(10), 
REQUIRED_TEXT VARCHAR(4000), 
PRIMERY KEY (IDENTFIER)); 

Ensuite, écrire la requête pour extraire les données rejoignent les deux tables, la commande par ligne dans le domaine de mon_texte. Votre application devra diviser la chaîne en morceaux de 2 000 caractères et les insérer dans l'ordre. Je le ferais dans une procédure PL/SQL. Insérez et sélectionnez. Les chaînes PL/SQL VARCHAR peuvent contenir jusqu'à 32 caractères. Ce qui peut ou ne pas être assez grand pour vos besoins.

Mais comme toute autre personne répondant à cette question, je suggère fortement de faire un cas à l'AD pour faire de la colonne un CLOB. Du point de vue du programme, ce sera un BLOB et donc simple à gérer.

+0

Je pense que je comprends ce que vous dites. Pourriez-vous s'il vous plaît expliquer un peu plus, peut-être avec un exemple? – user32262

Questions connexes