pl sql和动态sql

时间:2009-09-30 11:09:34

标签: dynamic dynamic-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;

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

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

3 个答案:

答案 0 :(得分: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 :(得分: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;

答案 2 :(得分: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;

您可以使用多个选项来组合您的语句,以便更新选择字段和类型。

相关问题