2010-06-04 10 views
12

Wir haben eine Tabelle in Oracle 11g mit einer varchar2 Spalte. Wir verwenden eine proprietäre Programmiersprache, in der diese Spalte als String definiert ist. Maximal können wir 2000 Zeichen (4000 Bytes) in dieser Spalte speichern. Jetzt ist die Anforderung, dass die Spalte mehr als 2000 Zeichen (tatsächlich unbegrenzte Zeichen) speichern muss. DBAs mögen BLOB- oder LONG-Datentypen aus Wartungsgründen nicht.Wie speichern Sie unbegrenzte Zeichen in Oracle 11g?

Die Lösung, die ich mir vorstellen kann, ist diese Spalte aus der ursprünglichen Tabelle zu entfernen und eine separate Tabelle für diese Spalte haben und dann jedes Zeichen in einer Zeile speichern, um unbegrenzte Zeichen zu erhalten. Diese Tabelle wird mit der ursprünglichen Tabelle für Abfragen verknüpft.

Gibt es eine bessere Lösung für dieses Problem?

UPDATE: Die proprietäre Programmiersprache erlaubt Variablen vom Typ String und Blob zu definieren, gibt es keine Option von CLOB. Ich verstehe die Antworten, aber ich kann die DBAs nicht übernehmen. Ich verstehe, dass das Abweichen von BLOB oder LONG der Alptraum der Entwickler sein wird, aber immer noch nicht helfen kann.

UPDATE 2: Wenn maximal 8000 Zeichen benötigt werden, kann ich einfach 3 weitere Spalten hinzufügen, so dass ich 4 Spalten mit je 2000 Zeichen habe, um 8000 Zeichen zu erhalten. Wenn also die erste Spalte voll ist, werden die Werte in die nächste Spalte und so weiter übertragen. Wird dieses Design irgendwelche schlechten Nebenwirkungen haben? Bitte vorschlagen.

+15

Das klingt sicher wie eine DailyWTF-Geschichte vor unseren Augen ... –

+1

Nun, wenn Sie Ihren DBAs sagen, dass Sie das tun werden, dann bin ich sicher, dass sie bereit wären, BLOB zu überdenken oder LANGE. Alles, um das zu vermeiden :) –

+1

Als Junior-Entwickler hatte ich diese Situation und wurde gezwungen, eine Reihe von Nvarchar-Reihen nacheinander abzubilden. Die Einfüge- und Aktualisierungslogik war so komplex, dass die Anwendungsschicht einen Pflegekopfschmerz hatte, der viel schlimmer war als der dba-Kopfschmerz. – dkackman

Antwort

1

BLOB ist die beste Lösung. Alles andere wird weniger bequem und ein größerer Wartungsaufwand sein.

2

Sie sagten kein BLOB oder LANG ... aber was ist mit CLOB? 4GB Zeichendaten.

12

Wenn ein Blob ist, was Sie brauchen, überzeugen Sie Ihr dba, es ist was Sie brauchen. Diese Datentypen gibt es aus einem bestimmten Grund und alle rollen Ihre eigenen Implementierung wird schlechter sein als der eingebaute Typ.

Auch möchten Sie vielleicht auf die CLOB Art zu sehen, wie es Ihre Bedürfnisse ziemlich gut erfüllen wird.

1

Ist BFILE ein praktikabler alternativer Datentyp für Ihre DBAs?

1

Ich verstehe es nicht. Ein CLOB ist der geeignete Datenbankdatentyp. Wenn Ihre seltsame Programmiersprache mit Zeichenketten von 8000 (oder was auch immer) Zeichen umgehen wird, was hält sie davon ab, diese in einen CLOB zu schreiben.

Genauer gesagt, welchen Fehler erhalten Sie (von Oracle oder Ihrer Programmiersprache), wenn Sie versuchen, eine 8000 Zeichenfolge in eine als CLOB definierte Spalte einzufügen.

7

Sie können der Art und Weise folgen, wie Oracle ihre gespeicherten Prozeduren im Informationsschema gespeichert hat. Definieren Sie eine Tabelle mit der Bezeichnung text columns:

Die ID-Spalte ist der Fremdschlüssel für die Originaltabelle. Die Zeile ist eine einfache Ganzzahl (keine Sequenz), um die Textfelder in der richtigen Reihenfolge zu halten. Dies ermöglicht größere Datenmengen zu halten

Ja, das ist nicht so effizient wie ein Blob, Clob oder LONG (ich würde LONG Felder vermeiden, wenn überhaupt möglich). Ja, dies erfordert mehr Wartung. Wenn Ihre Datenbankadministratoren keine CLOB-Felder in der Datenbank verwalten, ist dies die zweite Option.

EDIT:

my_table unten ist, wo Sie derzeit die VARCHAR-Spalte haben Sie zu erweitern suchen. Ich würde es in der Tabelle für die kurzen Textfelder behalten.

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

schreiben Sie dann die Abfrage der Daten verbinden Sie die beiden Tabellen, die Bestellung von LINE im my_text Feld zu ziehen. Ihre Anwendung muss die Zeichenfolge in 2000 Zeichenblöcke aufteilen und sie in Zeilenreihenfolge einfügen.

Ich würde dies in einem PL/SQL-Verfahren tun. Beide einfügen und auswählen. PL/SQL VARCHAR-Zeichenfolgen können bis zu 32.000 Zeichen lang sein. Welche möglicherweise für Ihre Bedürfnisse groß genug ist oder nicht.

Aber wie jeder andere Mensch, der diese Frage beantwortet, würde ich dem DBA dringend empfehlen, die Spalte zu einem CLOB zu machen. Aus der Programmperspektive wird dies ein BLOB und damit einfach zu verwalten sein.

+0

Ich denke, ich verstehe, was Sie sagen. Könntest du bitte ein bisschen mehr erklären, vielleicht mit einem Beispiel? – user32262