0

I am trying to create some dynamic sql using the following code block

    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;

The statement never executes properly as there are missing single quotes around values.

Any ideas what i can do to make this small example work or is there any better way of doing this?

3 Answers 3

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;

use '''

Sign up to request clarification or add additional context in comments.

Comments

1

Maybe you can do it this way.

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;

Comments

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;

You can use multiple selections to compose your statement for selection fields to be updated and for the type.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.