问题描述:
    我将SqlServer的一个存储过程导入Oracle过程中出现这样的问题,存储过程新建时
没有报任何的错误,但是一调用就报错,重新编译也编译不了,代码如下:CREATE OR REPLACE PROCEDURE NEXT_VAL
AS
BEGIN
    BEGIN TRANSACTION
    declare :NEXT_VAL INTEGER 
    SELECT :NEXT_VAL = VAL FROM SEQ_SEED UPDLOCK
    --此句才是真正上锁
    UPDATE SEQ_SEED SET VAL= VAL + 1
    SELECT :NEXT_VAL = VAL FROM SEQ_SEED
    SELECT VAL as NEXT_VAL FROM SEQ_SEED
    COMMIT
    return :NEXT_VALEND

解决方案 »

  1.   

    没写过sqlsever的.这个语法有差异的吧
      

  2.   

    结帖率100.93%????神呐oracle中这样就可以了,update语句会加行锁的,这个不提交,别的执行不了。CREATE OR REPLACE FUNCTION NEXT_VAL
    RETURN NUMBER
    AS
    VAR_NEXT_VAL SEQ_SEED.VAL%TYPE;
    BEGIN
        UPDATE SEQ_SEED SET VAL= VAL + 1;
        SELECT VAL into VAR_NEXT_VAL FROM SEQ_SEED;
        return VAR_NEXT_VAL;
    END;
    /如果SEQ_SEED就是一个sequence的话,
    直接
    select SEQ_SEED.nextVal from dual就可以返回了,用不着自己建函数。。希望楼主说的是从sqlserver导到oracle,而不是从oracle导到sqlserver。
      

  3.   

    其实我这个存储过程要做的很简单,就是去取表SEQ_SEED中VAL字段的值,首先让VAL字段增1,然后把值取出来,你上面好像写的是一个函数,这应该有区别吧?
      

  4.   


    嗯,存储过程你要取出值,必须有out参数。如果没有out参数又要返回值,那就得用函数,但是函数只能返回一个值(游标啊、char啊、自定义类型啊之类反正只能返回一个值),考虑到你这里只要一个值,所以用了个函数。
      

  5.   

    你可以select next_val() from dual看看有没有结果。