代码如下:
    function deleteSingleRecord(tableName varchar2,uuid varchar2) return integer is
    --根据唯一号uuid在表tableName中删除一条记录。如果成功返回,不成功返回0
    p_str varchar2(500);
    
    begin
         p_str := 'delete from ' || tableName|| ' where projectid='||uuid;
         execute immediate p_str;
         return 1;
         
         exception /*如果发生异常*/
           WHEN OTHERS THEN
              RAISE; 
              return 0;/*失败*/
    end;
    
为什么会出错

解决方案 »

  1.   

    exception when others then
    begin
    raise;
    return 0;
    end;
      

  2.   

    exception里面的作为一个块,必须加begin 、end。否则解析为一句话,你这里就相当于
    return 1;
    insert ....;
    return 0;
    语法上是不允许的,因为前面已经return过了,就跟你在开发语言中一样,函数或方法中加连续的两个return而没有if、else是不会被编译通过的。
      

  3.   

    谢谢!但我的代码执行到:execute immediate p_str; 时就出错。这是什么原因呢?
      

  4.   

    这个字符串的问题 ' where projectid='
    要这样写: ' where projectid= ' 
      

  5.   

    没注意你的参数类型
      p_str := 'delete from ' || tableName|| ' where projectid='||uuid; 
    改为
      p_str := 'delete from ' || tableName|| ' where projectid= '''||uuid||''''; 
      

  6.   

    可以改成以下方式执行
    execute immediate 'delete from ' || tableName|| ' where projectid=:1' using uuid; 
      

  7.   

    '''||uuid||''''最后面是4个单引号,这是什么意思?谢谢
      

  8.   

    谢谢!如果我的函数定义变成如下形式:
    function deleteSingleRecord(tableName varchar2,uuid varchar2,limit integer) return integer其中limit限定删除的最多的记录个数。那上面的delete语句怎么写呢?
      

  9.   

    最外面的两个,表示这事一个字符串。里面的两个,表示这事一个转义了的单引号,就是uuid后面要跟上一个单引号。
    前面只有3个,因为最外面的两个的第一个在前面。
      

  10.   


    for i in 1..limit loop
    p_str := 'delete from ' || tableName|| ' where projectid='||uuid;
            execute immediate p_str; 
    end loop;
      

  11.   

    再问一个低级问题:我delete记录后,如何彻底从数据库中清除已经删除的记录?
      

  12.   


    delete 后 commit 记录自然已经被删除。
    你的 "彻底从数据库中清除" 和普通的 delete , commit 有什么区别?