J'ai le SQL suivant que je souhaite exécuter dans Oracle SQL Developer contre un serveur Oracle 10G:
Error at Command Line:1 Column:0 Error report: SQL Error: ORA-01704: string literal too long 01704. 00000 - "string literal too long" *Cause: The string literal is longer than 4000 characters. *Action: Use a string literal of at most 4000 characters. Longer values may only be entered using bind variables.
5 Réponses :
Vous ne pouvez pas contourner cela avec "plain" SQL. (Mais je serais heureux d'être avéré faux) p>
Vous aurez besoin d'une sorte de langage de programmation (par exemple Java, de procédure stockée) pour y faire face. p>
Une alternative consiste à télécharger les données XML dans une table (peut être effectuée avec SQL * Loader) et utiliser les valeurs de colonne dans votre requête. P>
C'est l'une des limitations de Oracle qui me rend vraiment des noix. Il y a 20 ans, cela aurait pu être quelque peu acceptable, mais de nos jours ... P>
J'espère que vous vous trompez aussi bien mais j'attends que vous soyez correct.
Une solution de contournement possible consiste à utiliser des blocs PL / SQL:
DECLARE xml VARCHAR2(32000) := '<theRange> <theRow><First>Bob</First><Last>Smith</Last><Age>30</Age></theRow> <theRow><First>Sue</First><Last>Jones</Last><Age>34</Age></theRow> ... ... ... <theRow><First>Tom</First><Last>Anderson</Last><Age>39</Age></theRow> <theRow><First>Ali</First><Last>Grady</Last><Age>45</Age></theRow> </theRange>'; BEGIN INSERT INTO temp_table(last,first,age) SELECT last, first, age FROM ( SELECT extractvalue(column_value, '/theRow/First') FIRST, extractvalue(column_value, '/theRow/Last') LAST, to_number(extractvalue(column_value, '/theRow/Age')) Age FROM TABLE(XMLSequence(XMLTYPE(xml).extract('/theRange/theRow')))) ) WHERE age BETWEEN 30 AND 35; END;
Toute façon d'insérer les résultats dans une table temporaire que je peux choisir parmi?
Une autre question. Est de 32 000 la limite à ce genre de chose? Si j'ai dépassé ce montant, aurais-je besoin de le calculer en 32 000 blocs de caractères.
32K (32767) IS, IIRC, la limite de taille absolue en octets pour une variable Varchar2 dans PL / SQL. Donc, vous auriez besoin d'utiliser des morceaux.
Où est-ce grand gros morceau de XML? Je suppose que vous ne le tapez pas. P>
En règle générale, je regarderais un programme qui lit la source et la transforme en un clob. Cela pourrait être un Perl / Python / Quel que soit le script sur un client, ou une routine latérale du serveur qui tire la valeur d'un serveur Web. P>
Le XML vient de quelques endroits différents. Actuellement, je construis un script SQL qui contient le XML, puis l'exécutant dans SQL Server. Je veux modifier les choses à courir à Oracle mais je rencontre des problèmes.
Vous aurez besoin d'utiliser un clou comme entrée sur xmltype () au lieu d'un varchar.
à l'aide de dbms_lob.loadclobfomfile code> pour charger le XML à partir d'un fichier ou en rupture de la XML en 32000 morceaux de caractères et ajoutant au clob. p>
Comment construisez-vous le "CLOB"? Fournir une solution complète qui fonctionne.
Vous pouvez utiliser SQL Solution de contournement à l'aide d'insertions / mises à jour où chaque partie si moins de 4000 caractères.
1 Faites l'insert comme insert avec une première partie est le littéral SQL jusqu'à 4000 caractères. 2 Faites les pièces supplémentaires comme mise à jour concaténant les pièces précédentes avec la partie suivante où la partie suivante est de 4000 caractères. 3 Répétez l'étape 2 jusqu'à ce que tout le grand littéral SQL soit mis à jour. P>
exemple, p>
Vous pouvez également faire insert ... valeurs (to_clob ('
((((((c || b) || (((((((((( E || f) || (g || h))) code>), tellement mieux ne pas utiliser ce hack sale :)