create or replace procedure PRU_TEST
is
insert_str varchar2(200);
begin    
   insert_str := 'insert into resmplsvpnlink_temp ml(
    col1,
    col2,
    col3
    )
    select
      ''A'',
      a.col2||''->''b.col2,
      to_char(sysdate, ''yyyyMMdd'')
    from A a inner join B b on a.id=b.id';
    execute immediate insert_str;
    commit;
end;上面是整个存储过程的代码,但是执行的时候没有错误信息,但是就是没有插入数据?怎么回事啊?

解决方案 »

  1.   

    把select单独拎出来执行有数据么
      

  2.   

    还是单独的执行以下插入select语句看以下有没有问题
      

  3.   

    你这个又不是ddl语句,没必要用execute immediate啊
    create or replace procedure PRU_TEST
    is
    insert_str varchar2(200);
    begin   
      insert into resmplsvpnlink_temp ml(
      col1,
      col2,
      col3
      )
      select
      ''A'',
      a.col2||''->''b.col2,
      to_char(sysdate, ''yyyyMMdd'')
      from A a inner join B b on a.id=b.id;
      commit;
    end;
      

  4.   

    不好意思,补充一下 
    resmplsvpnlink_temp 在存储过程中新建的临时表
      

  5.   

    不会是建的global temporary表吧
      

  6.   


    --动态sql拼接有错
    --Oracle中两个单引号才算一个
    create or replace procedure PRU_TEST
    is
    insert_str varchar2(200);
    begin   
      insert_str := 'insert into resmplsvpnlink_temp ml(col1,col2,col3) select '||'''A'''||',a.col2>b.col2,to_char(sysdate, '||'''yyyyMMdd'''||') from A a inner join B b on a.id=b.id';
      execute immediate insert_str;
      commit;
    end;
      

  7.   

    把insert语句直接执行是可以的,就是放在存储过程中执行就没有效果。我是想把建表和插入,然后在删除临时表放在存储过程中一步完成了。
      

  8.   

    resmplsvpnlink_temp的建表语句呢?
      

  9.   

    已写入 file afiedt.buf  1  create or replace procedure PRU_TEST
      2  is
      3  insert_str varchar2(200);
      4  begin
      5    insert_str := 'insert into resmplsvpnlink_temp(--我把你这里ml去掉了
      6    col1,
      7    col3
      8    )
      9    select
     10    ''A'',
     11    to_char(sysdate, ''yyyyMMdd'')
     12    from dual';
     13    execute immediate insert_str;
     14* end;
    SQL> /过程已创建。SQL> exec pru_test;PL/SQL 过程已成功完成。SQL> select * from resmplsvpnlink_temp;COL1       COL2                 COL3
    ---------- -------------------- ----------
    A                               20100925SQL> exec pru_test;PL/SQL 过程已成功完成。SQL> select * from resmplsvpnlink_temp;COL1       COL2                 COL3
    ---------- -------------------- ----------
    A                               20100925
    A                               20100925
      

  10.   

    临时表有两种:你的是不是事物级别的,一旦commit ,表中的数据就清空了;
                    如果是会话级别的,commit后数据时存在的,但是会话退出后数据清空的。另外:pl/sql中用四个单引号才能表示一个引号:程序中写四个'''' ,解析完成后才是一个'。
      

  11.   

    非常感谢大家,问题解决了,是我这边程序的问题,直接在plsql中调用是没有问题,在hibernate中调用解决却不对,是因为hibernate还没有提交数据呢。结贴了。