Проблема с Execute immedite - PullRequest
       10

Проблема с Execute immedite

1 голос
/ 21 октября 2010

Я пытаюсь запустить этот код ниже, используя Execute Immediate, но он не работает и значения верны.

Пожалуйста, предложите правильный код.

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;  

Ответы [ 3 ]

5 голосов
/ 21 октября 2010

Намного проще (и лучше) использовать переменные связывания:

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;  

Также удобно использовать строковую переменную для хранения SQL.Затем вы можете использовать DBMS_OUTPUT.PUT_LINE для просмотра и проверки:

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; 
3 голосов
/ 21 октября 2010

Кажется, вы пропустили кавычки:

должно быть:

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

, потому что v_conc_name это varchar2

0 голосов
/ 21 октября 2010

Я бы сделал так:

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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...