L'EXPORTATION, COMME les ÉTATS d'INSERTION: Mais dans SQL Plus la ligne remplace 2500 caractères!
J'ai à l'exportation d'une table Oracle comme les ÉTATS d'INSERTION.
Mais les INSTRUCTIONS d'INSERTION ainsi généré, remplacer 2500 caractères.
Je suis obligé de les exécuter dans SQL Plus, donc, je reçois un message d'erreur.
C'est ma table Oracle:
CREATE TABLE SAMPLE_TABLE
(
C01 VARCHAR2 (5 BYTE) NOT NULL,
C02 NUMBER (10) NOT NULL,
C03 NUMBER (5) NOT NULL,
C04 NUMBER (5) NOT NULL,
C05 VARCHAR2 (20 BYTE) NOT NULL,
c06 VARCHAR2 (200 BYTE) NOT NULL,
c07 VARCHAR2 (200 BYTE) NOT NULL,
c08 NUMBER (5) NOT NULL,
c09 NUMBER (10) NOT NULL,
c10 VARCHAR2 (80 BYTE),
c11 VARCHAR2 (200 BYTE),
c12 VARCHAR2 (200 BYTE),
c13 VARCHAR2 (4000 BYTE),
c14 VARCHAR2 (1 BYTE) DEFAULT 'N' NOT NULL,
c15 CHAR (1 BYTE),
c16 CHAR (1 BYTE)
);
HYPOTHÈSES:
a) je suis OBLIGÉ d'exporter les données de la table comme les ÉTATS d'INSERTION; je suis autorisé à utiliser mise à JOUR des déclarations, afin d'éviter le SQL*Plus d'erreur "sp2-0027 d'entrée est trop long(>2499 caractères)";
b) je suis OBLIGÉ d'utiliser SQL*Plus pour exécuter le script, de sorte généré.
c) supposons que chaque dossier peut contenir des caractères spéciaux: CHR(10), CHR(13), et ainsi de suite;
d) je ne PEUX PAS utiliser SQL Loader;
e) je ne PEUX PAS exporter et d'importer la table: je peux seulement ajouter de la "delta" à l'aide de l'INSERTION /mise à JOUR des déclarations par le biais de SQL Plus.
La réponse est la suivante: Dans ma table Oracle appelé SAMPLE_TABLE, j'ai 80 dossiers où la longueur de la C13 champ, de type VARCHAR2(4000), est 3762 caractères. Cela signifie que, bien sûr, la VALEUR de C13 dépasse 2499 caractères. Dans ce cas, nous pouvons observer que la longueur de l'ÉNONCÉ dépasse 2499 personnages, trop.
le poulet dans la cuisine - Ce qui est la clé primaire de la table de destination?
Veuillez supposons que la table source et la table de destination n'ai PAS de clé primaire.
Vous ne connaissez que le champ C13 a, parfois, des valeurs qui atteignent 4000 caractères.
OriginalL'auteur UltraCommit | 2010-04-29
Vous devez vous connecter pour publier un commentaire.
Wow, ces contraintes sont assez limité mais je pense qu'il y a peut être un moyen de contourner cela. Je pense que vous pouvez très bien avoir à écrire votre propre script pour cette.
Je voudrais utiliser Java avec JDBC moi-même (mais n'importe quel langage qui permet de connecter et de lire la base de données, et les chaînes de sortie, fera l'affaire), d'écrire un petit programme qui extrait un ensemble d'enregistrements de chaque ligne dans la base de données. Ensuite, pour chacune de ces lignes:
Construire une instruction insert, avec l'ensemble complet de données. Si c'est moins de 2 000 octets, puis il suffit de sortie pour le fichier et de passer à la ligne suivante.
Autrement créer une instruction insert pour chaque champ, mais laissez le
c13
champ''
(vide).Alors, tant que votre
c13input
chaîne est supérieure à 2000 caractères, la sortie d'une mise à jour de l'énoncé de la forme"update tbl set c13 = c13 || '" + c13input.substring (0,2000) + "' where ..."
(en y ajoutant le cours des 2000 caractères), puis fairec13input = c13input.substring(2000)
à bande large de ces caractères à partir de votre chaîne.Une fois
c13input
est inférieure ou égale à 2000 caractères, tout juste sortie d'une mise à jour finale de virer de bord sur la fin.Cela vous permet de garder vos instructions SQL autour de l'an 2000-caractère marquer et exécuter efficacement le SQL correcte pour repeupler une autre table de base de données.
C'est le type de chose que je suis en train de parler (pour une table qui contient une clé primaire
c1
et un grand honkin' varcharc13
):Évidemment, vous pouvez avoir besoin de transformer les chaînes de caractères permettant d'insérer des caractères spéciaux - je ne suis pas sûr de ce format Oracle s'attend à ce que dans, mais ce devrait être une simple question de passer les cordes (
r.get("c13")
si la longueur de la pleine insertion est inférieure à 2000,f.substring(0,2000)
etf
si vous êtes à la construction de mises à jour) à une fonction d'aide pour ce faire.Si que le morphing est susceptible d'augmenter la taille de la ligne imprimée, vous pouvez déposer le seuil à 1000 à la sécurité, à assurer la transformée de chaîne ne risque pas d'entraîner une ligne de plus que le PL/SQL limite.
Désolé si cela semble compliquée, mais les restrictions que vous avez déclaré ischio-jambiers-nous un peu. Il pourrait bien y avoir une meilleure façon, mais je ne peux pas penser à celui qui répond à tous à vos critères.
Mise à jour: Il semble que vous êtes encore plus gênés qu'on ne le pensait: si vous devez vous limiter à SQL pour générer le script ainsi que l'exécutant, il y a un chemin, tortueux mais il est.
Vous pouvez utiliser SQL pour générer du SQL. À l'aide de mon mentionnées ci-dessus de la table avec
c1
etc13
, vous pouvez le faire:Qui va vous donner de toutes vos données de référence
insert
consolidés pour la duplication de tout, mais lac13
colonne.Ce que vous devez faire est de générer plus de déclarations pour la mise
c13
. Pour mettre à jourc13
pour toutes les valeurs de la longueur 1000 ou moins (jeu simple):Puis, à
update
c13 pour toutes les valeurs entre 1001 et 2000 caractères (ensemble, puis ajouter):Et ainsi de suite pour ceux qui sont de 2001 à 3000 et 3001 à 4000 en longueur.
Il y a probablement besoin d'être quelques ajustements à faire. Je suis heureux de vous donner un moyen de le résoudre, mais mon désir de travailler sur une telle monstruosité jusqu'à l'achèvement est minime, au mieux 🙂
Il faire le travail? Oui. Est-ce assez? Je dirais que c'est un retentissant "NON!", mais, compte tenu de vos contraintes, qui peuvent être le mieux que vous puissiez espérer.
Comme une preuve de concept, voici un script SQL DB2 (pas bien, il devrait fonctionner correctement dans un SGBD qui a un
length
etsubstr
équivalent):et cela génère les lignes suivantes:
Briser les lignes en sortie, nous obtenons:
qui devrait vous donner les rangées d'origine, mais dans un rond-point.
Et c'est autant d'efforts que je peux mettre dans une question sans que mon cerveau friture, donc je vais vous disons adieu à moins d'erreurs graves sont me l'a fait remarquer.
Bonne chance avec votre projet, et meilleurs voeux.
Pas de. Si vous êtes limité à PL/SQL pour la création du script ainsi, fondamentalement, vous allez être dans un très bruts de l'heure. C'est une belle langue pour l'écriture de scripts SQL, mais il n'est pas bon pour l'usage général des choses. Vous avez dit que vous avez été "OBLIGÉ d'utiliser SQL*Plus pour exécuter le script, de manière à générer" et ne dit rien sur les conditions requises pour réellement faire le script qui est pourquoi j'ai suggéré à mon approche. Oracle vous permet de vous connecter via JDBC assez facilement et les outils Java sont libres donc c'est toujours ma réponse, tout simplement parce que vous vous limitez à PL/SQL va être beaucoup plus difficile que d'apprendre le Java/JDBC.
Cela dit, je vais vous donner un début (voir mon edit) mais ça va être long, tortueux chemin à parcourir 🙂
Ta solution me semble très intéressant... je suis impatient de les analyser et de les tester: si cela fonctionne, je vais accepter la réponse. Toutes les autres indices sont toujours appréciés.
vous semblez avoir l'habitude de susciter de long, en profondeur des réponses à vos questions. 🙂
OriginalL'auteur paxdiablo
Vous pouvez utiliser le Geôlier de l'outil (http://jailer.sf.net) pour exporter les données de la table comme les ÉTATS d'INSERTION.
Vous avez raison, mais l'outil que j'ai mentionné encapsule les lignes de sorte qu'il est possible d'utiliser SQL*Plus pour importer les données.
Je confirme que je n'ai pas de problèmes d'exporter les enregistrements des INSTRUCTIONS INSERT, parce que je utiliser CRAPAUD (par Quest Software). Dans l'après-midi je vais essayer d'utiliser Geôlier outil, pour voir ce qui se passe exporter ma table de données avec le Geôlier. L'objectif est que les INSTRUCTIONS d'INSERTION générées avec le Geôlier ne donnera pas les SQL*Plus d'erreur "sp2-0027 d'entrée est trop long(>2499 caractères)".
Je suis désolé, mais Geôlier outil est trop difficile à utiliser, je voudrais une solution en PL/SQL, sans l'aide d'outils externes. Les utilisateurs doivent avoir la possibilité de résoudre ce problème eux-mêmes.
De plus, je ne suis pas en mesure de se connecter à ma Base de données Oracle 10G R2 avec cet outil...
OriginalL'auteur RDoubleYou