0

我正在尝试使用以下代码块创建一些动态 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;

该语句永远不会正确执行,因为值周围缺少单引号。

我可以做些什么来使这个小例子起作用,或者有什么更好的方法吗?

4

3 回答 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;

利用 '''

于 2009-09-30T11:32:01.373 回答
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;
于 2009-09-30T12:27:35.020 回答
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;

您可以使用多个选择来为要更新的选择字段和类型编写语句。

于 2014-12-05T14:33:05.817 回答