2010-10-21 19 views
1

J'essaie d'exécuter ce code ci-dessous en utilisant Execute Immediate mais cela ne fonctionne pas et les valeurs sont correctes.Problème avec Execute immedite

Veuillez suggérer le code correct.

declare 
v_count number:=1; 
v_conc_name varchar2(400); 
v_val VARCHAR2(20):='vineet'; 
BEGIN 
v_conc_name:='INT_AP_PAY_CONV'; 
EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details 
       SET 
       PARAMETER'||v_count||'=' 
       ||v_val||' where CONCURRENT_PROGRAM_SHORT_NAME= '||v_conc_name; 

end; 
+1

Quel message d'erreur obtenez-vous? – OmerGertel

Répondre

3

Semble vous avez manqué citations:

devrait être:

||' where CONCURRENT_PROGRAM_SHORT_NAME= '''||v_conc_name || ''''; 

parce v_conc_name est varchar2

+0

@OmerGertel, je crois que l'espace manquant après PARAMETER est correct, c'est-à-dire que le code génère le nom de colonne PARAMETER1. –

5

Il est beaucoup plus facile (et meilleures pratiques) d'utiliser des variables bind:

declare 
v_count number:=1; 
v_conc_name varchar2(400); 
v_val VARCHAR2(20):='vineet'; 
BEGIN 
v_conc_name:='INT_AP_PAY_CONV'; 
EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details 
       SET 
       PARAMETER'||v_count||'=:bv_val 
       where CONCURRENT_PROGRAM_SHORT_NAME=:bv_conc_name' 
    USING v_val, v_conc_name; 

end; 

C'est aussi une pratique pratique d'utiliser une variable de chaîne pour contenir le SQL. Ensuite, vous pouvez utiliser DBMS_OUTPUT.PUT_LINE pour afficher et vérifier:

declare 
v_count number:=1; 
v_conc_name varchar2(400); 
v_val VARCHAR2(20):='vineet'; 
v_sql LONG; 
BEGIN 
v_conc_name:='INT_AP_PAY_CONV'; 
v_sql := 'UPDATE xxx_cnc_prg_details 
       SET 
       PARAMETER'||v_count||'=:bv_val 
       where CONCURRENT_PROGRAM_SHORT_NAME=:bv_conc_name'; 
EXECUTE IMMEDIATE v_sql USING v_val, v_conc_name; 

end; 
0

je ferais comme ceci:

DECLARE 
    c   CONSTANT CHAR := ''''; 
    v_conc_name VARCHAR2(400) := 'INT_AP_PAY_CONV'; 
    v_val  VARCHAR2(20) := 'vineet'; 
    v_count  NUMBER  := 1; 
BEGIN 
    EXECUTE IMMEDIATE 'UPDATE xxx_cnc_prg_details 
        SET 
        PARAMETER'||v_count||' = '||c||v_val||c||' 
        where CONCURRENT_PROGRAM_SHORT_NAME = '||c||v_conc_name||c; 

END; 
+0

Je préfère la concaténation si la partie dynamique est longue (ce qu'elle n'est pas dans ce cas), car avec les variables de liaison le maintien du code est un peu plus difficile. Et je fais beaucoup de code Forms où j'ai besoin de citation de concaténation plus souvent. –