存储过程不能自己使用DDL语句,要使用动态语句来执行
CREATE or replace function Code
Return Varchar2 as
vGlideCode Varchar2(20);
seq_year varchar2(4);
str  varchar2(100);
begin
     update tbl_seqYear set seqYear=to_char(sysdate,'yyyy');
   str:='drop sequence xxSeq';
   execute immediate str;
   str :='create sequence xxSeq '
   execute immediate str;
   select xxSeq.nextval into vGlideCode from dual;
  end if;
  return(vGlideCode);
end;

解决方案 »

  1.   

    还有使用存储过程建立表的时候,用户要有明确的CREATE TABLE的权限
      

  2.   

    在存储过程中执行DDL语句需要用动态语句
    EXECUTE IMMEDIATE DDLSQL
      

  3.   

    好是好了不过又出现了问题create or replace function GlideCode
    Return Varchar2 as
    vCode Varchar2(20);
    sy varchar2(4);
    sqlStr varchar2(200);
    begin
      select sn into sy from syy;
      if sy=to_char(sysdate,'yyyy') then
        select ss.nextval into vcode from dual;
      else
        sqlStr := 'update syy set sn ='||to_char(sysdate,'yyyy');
        execute immediate sqlStr;
        execute immediate 'drop sequence ss;
        execute immediate 'create sequence ss';
        select ss.nextval into vcodefrom dual;
      end if;
      return(vGlideCode);
    end;ORA-14551: 无法在查询中执行 DML 操作
    请问怎么解决在查询的同时做DML操作啊?????
      

  4.   

    create or replace function GlideCode
    Return Varchar2 as
    vCode Varchar2(20);
    sy varchar2(4);
    sqlStr varchar2(200);
    begin
      select sn into sy from syy;
      if sy=to_char(sysdate,'yyyy') then
        select ss.nextval into vcode from dual;
      else
        update syy set sn =to_char(sysdate,'yyyy');--这里不需要动态执行
        --execute immediate sqlStr;
        execute immediate 'drop sequence ss;
        execute immediate 'create sequence ss';
        select ss.nextval into vcode  from dual;--z这里少了个空格
      end if;
      return(vGlideCode);
    end;
      

  5.   

    还是一样的,无法在查询中执行 DML 操作
      

  6.   

    execute immediate 'drop sequence ss;
    ↑少了一個単引号
      

  7.   

    这个我知道。与语法无关了。好象是在查询一个表的时候不能做DML操作,请问该怎么做啊
      

  8.   

    select sn into sy from syy;
    这条语句如果返回多条记录会出错,这样要使用到游标
      

  9.   

    select sn into sy from syy;这条语句只返回一条记录,我在表里面只有一条数据
      

  10.   

    SELECT sn INTO sy FROM syy;
    此処↑会出Exception (NO_DATA_FOUND,TOO_MANY_ROWS等)在最後要加BEGIN --main
      -- 省略
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        RETURN '0';
      WHEN TOO_MANY_ROWS THEN
        RETURN '0';
      WHEN OTHERS THEN
        RETURN '0';
    END;
      

  11.   

    你是在调用函数时出的错吧,你是执行
    select ..., GlideCode() ,  ... from ... ?
      

  12.   

    是在执行update syy set sn =to_char(sysdate,'yyyy');时提示法在查询中执行 DML 操作
    权限我已经加了,没有问题
      

  13.   


    是在执行update syy set sn =to_char(sysdate,'yyyy');时提示法在查询中执行 DML 操作
    权限我已经加了,没有问题
    ---------------------------------------------------
    上面的语句单独执行肯定是没有问题的。
    SQL> update test set time=to_char(sysdate,'yyyymmddhh24miss');3 行 已更新SQL> commit;提交完成你单步调试,看问题是出在哪句上。  
      

  14.   

    你是在你的查询语句中使用了你建的函数吧. 不允许这么用的,
    你应该把你的DML语句写在过程中执行.
      

  15.   

    'create sequence ss'
    创建表怎么连字段都不加?其次,动态DML可以在存储过程中使用,但函数中我就不清楚了。
      

  16.   

    肯定是dinya2003说的那种情况!