CREATE OR REPLACE  PROCEDURE "SIC"."BASE_CHECK" (POwner in 
    varchar2,PTableName in varchar2,PSourceOwner in varchar2,
    PSourceTableName in varchar2,PFlag out varchar2)
as
  strsql varchar2(255);
  strsql_1 varchar2(255);    
begin
  PFlag := '0';  strsql   := 'declare'||
                ' ssql varchar2(200);'|| 
                ' column varchar2(100);'||
                ' cursor cur_tc is '||
                ' select column_name,nullable from all_tab_columns '||
                '  where nullable=''N'''||
                '  and table_name = '''||upper(PSourceTableName)||''''||
                '  and owner='''||upper(PSourceOwner)||''';';
  strsql_1 :=   'begin'||
                ' for cur_rec in cur_tc loop'||
                '   column := cur_rec.column_name '|| '|| '' is null''; '||
                '   ssql := ''update '||upper(POwner)||'.'||upper(PTableName)||' set XXX998_FLAG=''''11'''',XXX998_REMARK=''''''||column||'''''' where ''||column||'' '';'||
                '   execute immediate ssql;'||
                '   commit;'||
                ' end loop;'||         
                'end;';
             
  DBMS_OUTPUT.PUT_LINE(strsql);
  DBMS_OUTPUT.PUT_LINE(strsql_1);  
  execute immediate strsql||strsql_1;
  
end;

解决方案 »

  1.   

    在execute immediate strsql||strsql_1后面加
    COMMIT
      

  2.   

    "在execute immediate strsql||strsql_1后面加COMMIT;"
    这样做是不行的,还是提交不了
      

  3.   

    你应该把strsql||strsql_1;取出来看看
    有没有语法错误
      

  4.   

    动态sql语句里不能嵌套动态sql语句
    begin
    execute immediate 'execute immediate ''delete from test ''  ';
    end;ORA-00900: 无效 SQL 语句
    ORA-06512: 在line 2
      

  5.   

    分开来进行COMMIT试试,在strsql,和strsql_1后面分别加上execute immediate strsql,execute immediate strsql_1
      

  6.   

    分开来进行COMMIT试试,在strsql,和strsql_1后面分别加上execute immediate strsql;commit;
    /execute immediate strsql_1;commit;
      

  7.   

    我觉得你写的动态SQL有问题,你做了2次提交,你把'execute immediate ssql;'||'commit ;'去掉,再用我上面的方法试试