2010-10-01 3 views
3

Parfois, je souhaite générer des instructions INSERT à partir du contenu d'une table de base de données.Oracle équivalent à la fonction quote() de SQLite

Avec SQLite, je peux faire:

SELECT 'INSERT INTO foo (col1, col2) VALUES (' || quote(col1) || ',' || quote(col2) || ');' 
    FROM bar; 

Avec Oracle, je dois faire:

SELECT 'INSERT INTO foo (col1, col2) VALUES (''' || replace(col1, '''', '''''') || ''',''' || replace(col2, '''', '''''') || ''');' 
    FROM bar; 

Et d'ailleurs, il ne fonctionnera pas avec les valeurs NULL.

Y a-t-il un meilleur moyen?

Répondre

4

Si vous êtes sur 11g, j'utiliser DBMS_ASSERT.ENQUOTE_LITERAL au lieu de rouler votre propre .

+0

Je suis sur 11.2 et il ne semble pas faire ce que OP a demandé. 'enquote_literal ('a''b')' renvoie une erreur, alors que 'enquote_literal ('a' '' '' b ')' renvoie ''a''b'' au lieu de''a' '' '' b ' – Tobia

1

vous devez utiliser paramètres de liaison:

http://use-the-index-luke.com/where-clause/bind-parameters

+1

Je ne sais pas si cela m'aide. Les paramètres de liaison sont, d'après ce que j'ai compris, utilisés lors de la préparation des instructions SQL dans un programme, et en passant les paramètres avec la requête. Dans ce cas, je veux générer des requêtes que je peux copier-coller dans un script SQL pur (pour exécuter Toad, Tora, SQL * Plus ou un shell SQLite, peu importe). – Benoit

+1

ok, alors cela n'aidera pas :( –

4

Je ne vois pas de problème avec votre code dans nulls. Là où il y a des valeurs nulles, la valeur insérée sera '', ce qui est la même chose que null dans Oracle (je sais, je sais ...) par ex.

INSERT INTO foo (col1, col2) VALUES ('XXX',''); 

et cela fonctionne.

Vous pouvez créer la fonction QUOTE dans Oracle comme ceci:

create function quote (p_text varchar2) return varchar2 is 
begin 
    return '''' || replace (p_text, '''', '''''') || ''''; 
end; 

puis votre SqlLite SQL travaillerez dans Oracle aussi.

Méfiez-vous des dates et du masque de format par défaut: vous perdrez toutes les informations d'heure dans la table source, sauf si vous définissez le masque de format par défaut pour l'inclure, par ex.

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'; 

(Cela doit être réglé sur la même valeur lorsque le script est exécuté aussi.)

Je note du point de Marcus sur l'utilisation de variables de liaison, mais cela me semble être un de ceux d'un des scripts qui sont exécutés puis jetés, pas un peu de code de production qui sera exécuté encore et encore, donc je n'ai pas de problème avec les littéraux. Des outils comme Toad et SQL Developer ont des facilités pour générer des insertions avec des littéraux comme ça en fait.

+1

Je pense que la fonction quote devrait retourner ''' '' || replace (p_text, '' '', '' '' '') || '' '' – Benoit

+0

Oui, merci, j'ai corrigé la fonction maintenant –

1

vous pouvez également utiliser l'opérateur Q-citation introduite dans Oracle 10g:

SELECT 'INSERT INTO foo (col1, col2) VALUES (q''#' || col1 || '#'', q''#' || col2 || '#'');' 
    FROM bar; 

Résultat:

INSERT INTO foo (col1, col2) VALUES (q'#col1's value#', q'#col2's value#'); 
+0

Cela vaut quelque chose, mais pas vraiment sûr! Imaginez le contenu col2 est '# '); TRUNCATE TABLE foo; --', que se passe-t-il?En outre, cela ne fonctionnera que pour l'importation dans une base de données Oracle ... – Benoit

Questions connexes