2009-09-30 1 views
0

Я пытаюсь создать некоторые динамический SQL, используя следующий блок кодапл SQL и динамический SQL

firstSqlStatement := true; 
    updateText := 'UPDATE T_EMPLOYEES SET '; 
    if FIRSTNAME IS NOT NULL and FIRSTNAME > 0 THEN 
     updateText:=updateText || ' firstName=' || FIRSTNAME || ' '; 
     firstSqlStatement := false; 
    end if; 

    if MIDDLENAME IS NOT NULL and length(MIDDLENAME) > 0 THEN 
     if firstSqlStatement = false THEN 
      updateText:=updateText || ','; 
     end if; 

     updateText:=updateText || ' middleName=' || MIDDLENAME || ' '; 
     firstSqlStatement := false; 
    end if; 

    updateText:=updateText 
      || ' where upper(id)=upper(' || ID ||');';      
    DBMS_OUTPUT.put_line(updateText); 
    EXECUTE IMMEDIATE updateText; 

Оператор никогда не выполняет должным образом, поскольку есть отсутствуют одиночные кавычки значений.

Любые идеи, что я могу сделать, чтобы этот небольшой пример работал или есть лучший способ сделать это?

ответ

1
firstSqlStatement := true; 
updateText := 'UPDATE T_EMPLOYEES SET '; 

if FIRSTNAME IS NOT NULL and FIRSTNAME > 0 THEN 
    updateText:=updateText || ' firstName=''' || FIRSTNAME || ''' '; 
    firstSqlStatement := false; 
end if; 

if MIDDLENAME IS NOT NULL and length(MIDDLENAME) > 0 THEN 
    if firstSqlStatement = false THEN 
     updateText:=updateText || ','; 
    end if; 

    updateText:=updateText || ' middleName=''' || MIDDLENAME || ''' '; 
    firstSqlStatement := false; 
end if; 
updateText:=updateText || ' where upper(id)=upper(' || ID || ');'; 
DBMS_OUTPUT.put_line(updateText); 
EXECUTE IMMEDIATE updateText; 

использование ''»

1

Может быть, вы можете сделать это таким образом.

declare 
    ll_employee_id number := 10; 
    lv_firstname varchar2(30) := 'Thomas'; 
    lv_middlename varchar2(30) := null; 
begin 
    update t_employees 
    set firstname = decode(lv_firstname, null, firstname, lv_firstname), 
     middlename = decode(lv_middlename, null, middlename, lv_middlename) 
    where employee_id = ll_employee_id; 
end; 
0
DECLARE 
    my_error exception; 
    sql_stmt   VARCHAR2 (500); 
    v_char_field  VARCHAR2 (500); 
    v_number_field NUMBER; 
    v_stmt_number NUMBER; 
BEGIN 
    sql_stmt := 'UPDATE TABLE'; 

    IF 1 = 1 -- REPLACE WITH CONDITION FOR SELECTION FIELD 
    THEN 
     sql_stmt := sql_stmt || 'field_1 = :1'; 
     v_stmt_number := 1; 
    ELSIF 1 = 1 -- REPLACE WITH CONDITION FOR SELECTION FIELD 
    THEN 
     sql_stmt := sql_stmt || 'field_2 = :1'; 
     v_stmt_number := 2; 
    ELSE 
     DBMS_OUTPUT.put_line ('Field unmanaged'); 
     RAISE my_error; 
    END IF; 

    IF 1 = 1 -- REPLACE WITH CONDITION FOR SELECTION TYPE FIELD 
    THEN 
     EXECUTE IMMEDIATE sql_stmt USING v_char_field; 
    ELSIF 1 = 1 -- REPLACE WITH CONDITION FOR SELECTION TYPE FIELD 
    THEN 
     EXECUTE IMMEDIATE sql_stmt USING v_number_field; 
    ELSE 
     DBMS_OUTPUT.put_line ('Type Field unmanaged'); 
     RAISE my_error; 
    END IF; 

    DBMS_OUTPUT.PUT_LINE ('STATEMENT NUMBER : ' || v_stmt_number); 

    DBMS_OUTPUT.PUT_LINE ('TOTAL RECORD UPDATE : ' || SQL%ROWCOUNT); 
EXCEPTION 
    WHEN my_error 
    THEN 
     NULL; 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.PUT_LINE ('ERROR :' || SQLERRM); 
END; 

Вы можете использовать множественный выбор, чтобы составить ваше заявление для полей выбора, которые будут обновлены и для этого типа.