2009-03-30 4 views
1

permet de créer une première tableComment insérer dynamiquement à travers une variable en PL/SQL?

create table test 
(
    id number, 
    name varchar2(20) 
); 

Maintenant, au cours d'insertion, je veux tenir les données en première variable & puis passer dynamiquement la variable dans la clause VALUES comme ceci:

declare 
    v_data varchar2(50); 
begin 
    v_data:='1,sunny'; 
    execute immediate 'insert into test values(v_data)'; 
    commit; 
end; 

Mais sa montrant quelques erreurs (pas assez de valeurs) ...... plz aide comment y parvenir ??

+0

Essayez de créer une chaîne: dynstmt en effectuant une opération de chaîne, y compris les guillemets pour la valeur srting, puis utilisez EXEC SQL EXECUTE IMMEDIATE: dynstmt. Notez que ce n'est pas une bonne pratique car elle serait sujette à l'injection SQL. – Dheer

Répondre

4

Le test de table comporte deux colonnes. Vous n'en insérez qu'une et ne nommez pas quelle colonne elle est donc "pas assez de valeurs". Vous devez donc:

INSERT INTO test (name) VALUES (data) 

ou probablement mieux est de mettre dans un ID:

INSERT INTO test (id, name) VALUES (1, data) 

ou simplement:

INSERT INTO test VALUES (1, data) 

Pour ce genre de chose que j'utiliser un curseur plutôt que SQL dynamique (ou même SQL inline).

1

Vous devez utiliser différentes variables pour chaque valeur

déclare

Numéro de v_data1

v_data2 varchar2 (50);

commencent

v_data1: = 1

v_data2 = 'ensoleillé';

insérer dans les valeurs de test (v_data1, v_data2);

- Vous pouvez également l'insérer dans les valeurs de test (Name) (v_data2);

validation; fin;

+0

Mais mon exigence est différente, je dois passer la variable qui contient la chaîne de valeur commaseparated. –

0

Votre approche fonctionne, mais vous devez ajuster votre requête un peu:

execute immediate 'insert into test values(' || v_data|| ')'; 

de telle sorte que le contenu de votre variable v_data sont réellement insérés dans la chaîne, pas la valeur « v_data » lui-même.

+0

merci buddy ...mais il montre toujours l'erreur - ORA-00984: colonne non autorisée ici –

+0

les variables de liaison devraient être recommandées, mais pour les insertions occasionnelles, il ne peut y avoir de pénalité de performance, bien que cela soit une opportunité pour les attaques par injection sql. – Martlark

+0

Mais Martlark, toujours la déclaration ne fonctionne pas –

1

La façon normale de transmettre des valeurs dans les instructions SQL dynamiques est avec des variables liées comme ceci:

declare 
    v_id integer; 
    v_name varchar2(50); 
begin 
    v_id := 1; 
    v_name := 'sunny'; 
    execute immediate 
     'insert into test (id, name) values(:b1, :b2)' 
     using v_id, v_name; 
    commit; 
end; 

qui a besoin d'une variable par valeur.

Questions connexes