CREATE OR REPLACE FUNCTION GET_COUNT(v_ID varchar2) return VARCHAR2 as
 PRAGMA AUTONOMOUS_TRANSACTION; --自定义事务
  v_count varchar2(10);
  v_month char(2);
  v_sql   varchar2(2000);
Begin
  select to_char(sysdate, 'mm') into v_month from dual;
  v_sql := 'select count(1) into ' || 'v_count' || ' from LOG' || v_month || ' t where t.id =' || v_ID;  --感觉下面两行代码执行有问题 
  execute immediate v_sql; --执行到这里返回-1
  commit;
return v_count;Exception
  When Others Then
    Return - 1;
End GET_COUNT;
----------------------调用上面的Function
select GET_COUNT('3') AS retVal from dual;拼接出来的v_sql语句如下:
select count(1) into v_count from LOG04 t where t.id =3

解决方案 »

  1.   


    修改成  
     v_sql := 'select count(1) from LOG' || v_month || ' t where t.id =' || v_ID;  execute immediate v_sql into v_count; 
    试一下
      

  2.   

    --这两句改一下 
     v_sql := 'select count(1)  from LOG' || v_month || ' t where t.id =' || v_ID;
     execute immediate v_sql into v_count ;
      

  3.   

    在这个函数里开不用开启自治事务
    去掉
    PRAGMA AUTONOMOUS_TRANSACTION;

    commit;
      

  4.   

    --问题已经解决
    CREATE OR REPLACE FUNCTION GET_COUNT(v_ID varchar2) return VARCHAR2 as
     ---PRAGMA AUTONOMOUS_TRANSACTION;
      v_count varchar2(10);
      v_month char(2);
      v_sql   varchar2(2000);
    Begin
      select to_char(sysdate, 'mm') into v_month from dual;
      --v_sql := 'select count(1) into ' || 'v_count' || ' from LOG' || v_month || ' t where t.id =' || v_ID;  
      --execute immediate v_sql;  
     v_sql := 'select count(1) from LOG' || v_month || ' t where t.id =' || v_ID;
     execute immediate v_sql into v_count ;
    dbms_output.put_line(v_sql);  
     --commit;
    return v_count;Exception
      When Others Then
        Return - 1;
    End GET_COUNT;
    ---------------------------------------
    select GET_COUNT('2')  AS retval from dual;