Проблема с Execute immedite
Я пытаюсь запустить этот код ниже, используя 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 ответа
Намного проще (и лучше) использовать переменные связывания:
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;
Кажется, вы пропустили цитаты:
должно быть:
||' where CONCURRENT_PROGRAM_SHORT_NAME= '''||v_conc_name || '''';
потому что v_conc_name это varchar2
Я бы сделал так:
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;