Je dois générer des instructions de mise à jour basées sur une table dans notre base de données. J'ai créé le script suivant qui génère les instructions de mise à jour dont j'ai besoin. Mais quand j'essaye d'exécuter ces manuscrits j'obtiens des erreurs relatives aux guillemets simples non échappés dans le contenu et les caractères T qui ont une signification spéciale dans l'oracle. Je me suis occupé du problème & B et & T en réglant SET DEFINE OFF. Quel est le meilleur moyen d'échapper à des guillemets simples dans le contenu? Ici, si le prénom ou le nom de famille contient des guillemets simples, les instructions de mise à jour générées sont rompues. Quel est le meilleur moyen d'échapper ces guillemets simples dans le prénom et le nom de famille?Oracle 10g - Meilleure façon d'échapper des guillemets simples
0
A
Répondre
1
Vous pouvez utiliser REPLACE:
DECLARE
CURSOR C1 IS
SELECT * FROM EMPLOYEES;
BEGIN
FOR I IN C1
LOOP
DBMS_OUTPUT.PUT_LINE('UPDATE EMPLOYEES SET
FIRST_NAME= ''' || REPLACE(I.FIRST_NAME,'''','''''') || ''',
LAST_NAME = ''' || REPLACE(I.LAST_NAME,'''','''''') || ''',
DOB = TO_DATE(''' || TO_CHAR(I.DOB,'DD/MM/YYYY') || '',''DD/MM/YYYY'')'
WHERE EMPLOYEE_ID = ' || I.EMPLOYEE_ID || ';');
END LOOP;
END;
Notes:
- Vous avez été absent un
||
aprèsI.LAST_NAME
. - Je suppose que
I.EMPLOYEE_ID
est un nombre - dans ce cas, je ne l'entourerais pas de guillemets. - Je suppose que
I.DOB
est une date - dans ce cas, je vous recommande de le convertir explicitement en une date.
ALTERNATIVE: Si vous êtes sur Oracle 10g ou plus tard, vous pouvez utiliser cette syntaxe alternative qui peut être plus facile à lire; et utiliser REPLACE
pour le rendre un peu plus évident ce qui se passe - c'est ma préférence personnelle:
DECLARE
CURSOR C1 IS
SELECT * FROM EMPLOYEES;
BEGIN
FOR I IN C1
LOOP
DBMS_OUTPUT.PUT_LINE(REPLACE(REPLACE(REPLACE(REPLACE(
q'[UPDATE EMPLOYEES SET
FIRST_NAME= q'{#FIRST_NAME#}',
LAST_NAME = q'{#LAST_NAME#}',
DOB = DATE '#DOB#'
WHERE EMPLOYEE_ID = #EMPLOYEE_ID#;
]'
,'#FIRST_NAME#', I.FIRST_NAME)
,'#LAST_NAME#', I.LAST_NAME)
,'#DOB#', TO_CHAR(I.DOB,'YYYY-MM-DD'))
,'#EMPLOYEE_ID#', I.EMPLOYEE_ID)
);
END LOOP;
END;
ci-dessus a l'avantage qu'il est facile de repérer les erreurs possibles dans le SQL dynamique, qui n'est pas vérifiée à compiler le temps pour les erreurs de syntaxe.
Questions connexes
- 1. Façons d'échapper des guillemets simples dans la commande SQL 'LIKE'
- 2. échapper à des guillemets simples
- 3. Caractère mysql échappant à des guillemets simples
- 4. guillemets simples PHP regex
- 5. Ruby convertit des guillemets simples en guillemets doubles en XML
- 6. Remplacer des guillemets doubles guillemets simples avec awk
- 7. écho javascript avec des guillemets simples
- 8. Analyse XML avec des guillemets simples?
- 9. Echapper à des guillemets simples javascript
- 10. Fonction SQLServer pour des guillemets simples
- 11. Meilleure façon d'imprimer des rapports simples en Java
- 12. Comment puis-je remplacer les guillemets simples par des guillemets simples
- 13. Flex avec Oracle 10g
- 14. guillemets simples de sortie php
- 15. Vista et Oracle 10g
- 16. Oracle 10g Express/APEX
- 17. Oracle 10g format Float
- 18. nomfichier.Contains # (livre) ou '(guillemets simples)
- 19. Haskell: Analyse des caractères d'échappement dans des guillemets simples
- 20. Performances XAConnection dans Oracle (10g)
- 21. Aujourd'hui, mysql_real_escape_string() échappe les guillemets simples et les guillemets
- 22. Importation 3954275 Insertion d'instructions dans Oracle 10g
- 23. meilleure façon de supprimer '-' dans oracle SP
- 24. Oracle 10g - ORA-01747 erreur
- 25. False Alarm: SqlCommand, SqlParameter et des guillemets simples
- 26. Erreur d'importation avec oracle 10g
- 27. Oracle 10g Sauvegarde et restauration
- 28. reconstruire les index oracle 10G
- 29. C# Oracle Database émet 10g
- 30. Webparts ASP.NET avec Oracle 10g
@Jeffrey: Merci pour vos commentaires. Le seul inconvénient avec cette approche, je vois est qu'avec les valeurs NULL, je veux dire si first_name est arrivé à être NULL dans la table, en utilisant REPLACE (I.FIRST_NAME, '' '', '' '' '' '), nous sommes insérer une chaîne vide dans la table qui, je pense, n'est pas la même chose que NULL. N'est-ce pas? Pour l'instant, même si c'est plus bavard, j'ai utilisé IF..ELSE pour vérifier NULL et si non, j'ai utilisé q '(I.first_name)' et ainsi de suite. Ça marche. Encore une fois merci pour les commentaires. – Dharam
Non. Dans Oracle, la chaîne vide est la même que NULL. –
L'alternative avec Q-quotes est incomplète. Les guillemets simples resteront non échappés dans les instructions de mise à jour générées. Vous aurez besoin d'utiliser des Q-quotes à l'intérieur pour envelopper les colonnes de texte ainsi que _and_ avec des délimiteurs différents. par exemple. '# # FIRST_NAME # '' devrait être 'q {' # FIRST_NAME # '}' –