CREATE OR REPLACE PROCEDURE PRC_TEST005 IS
           LVD_TIME                    DATE;
       L_USER_EXCEPTION            EXCEPTION ;
       LVV_TOTAL                   NUMBER;       PROCEDURE PRO_SUB_TEST005 IS
        BEGIN
            INSERT INTO TES2
                (tb3)
                values
                (LVV_TOTAL) ;
            commit;
        EXCEPTION
            WHEN OTHERS THEN
        END; --------
    
BEGIN--------
    
    BEGIN
        SELECT SYSDATE
        INTO LVD_TIME
        FROM DUAL;
    EXCEPTION
        WHEN OTHERS THEN
        RAISE  L_USER_EXCEPTION;
    END;----    BEGIN
        MERGE INTO TES2
           USING TES3
           ON ( TES2.TB1 = TES3.TB1)
           WHEN MATCHED THEN
                UPDATE SET
                    
                    TES2.TB2 =TES3.TB2
           WHEN NOT MATCHED THEN
                INSERT  (TES2.TB1  , TES2.TB2   )
                VALUES  (TES3.TB1  , TES3.TB2   );
     EXCEPTION
        WHEN OTHERS THEN
        RAISE L_USER_EXCEPTION;
     END;     COMMIT;
     
----     BEGIN
        SELECT COUNT(*)
        INTO LVV_TOTAL
        FROM TES2;
     EXCEPTION
        WHEN OTHERS THEN
        RAISE L_USER_EXCEPTION;
     END;----         PRO_SUB_TEST005;--------EXCEPTION
    WHEN L_USER_EXCEPTION THEN
        ROLLBACK; 
    WHEN OTHERS THEN
        ROLLBACK;  
END;
/     
      请问  
    1.存储过程PRC_TEST005 里面 写一个 PRO_SUB_TEST005 存储过程 有问题吗?
      我在别的地方看到有这么写的,但是我写的总报错!
    2.异常抛出问题。
        a. WHEN OTHERS THEN  这个 OTHERS 是什么意思?是说随便写一个的?然后这个异常就不管了?
        b. RAISE 这是 异常抛出的意思吗?
        c. WHEN NO_DATA_FOUND THEN  这里的 NO_DATA_FOUND 是 系统定义好的异常吗?
    3.为什么 Oracle 的存储过程中 不能写 SELECT ?
 
    刚看书学的存储过程很多地方不明白,上面的存储过程当中写的怪异的部分还请指正!

解决方案 »

  1.   

    一个回帖的人都没有吗????
    简化一下
      CREATE OR REPLACE PROCEDURE PRC_TEST IS 
          PROCEDURE PRC_SUB_TEST IS
               BEGIN
               END;
    BEGIN
              PRC_SUB_TEST ;
    END
    就是这个格式~~
    摆脱高手请出手`~
      

  2.   

     1.存储过程PRC_TEST005 里面 写一个 PRO_SUB_TEST005 存储过程 有问题吗?
      我在别的地方看到有这么写的,但是我写的总报错!
      2.异常抛出问题。
      a. WHEN OTHERS THEN 这个 OTHERS 是什么意思?是说随便写一个的?然后这个异常就不管了?
      b. RAISE 这是 异常抛出的意思吗?
      c. WHEN NO_DATA_FOUND THEN 这里的 NO_DATA_FOUND 是 系统定义楼好的异常吗?
      3.为什么 Oracle 的存储过程中 不能写 SELECT ?
    楼主要看一下oracle pl/sql开发手册,你的问题都简单
    1.没问题,支持这种写法,你说报错应该是语法有问题,还有oralce版本不要太低,哪个版本开始支持的不记不清楚了。
    2.oracle有各种预定义异常,对于你没有捕获的异常全部会跳转到when others then下面执行代码
    3.过程里面肯定可以写select语句,对于查询出来的结果需要放到变量里面去。
      

  3.   

     1.存储过程PRC_TEST005 里面 写一个 PRO_SUB_TEST005 存储过程 有问题吗?
      我在别的地方看到有这么写的,但是我写的总报错!
    1-->存储过程里面可以写子存储过程的,应该是语法问题。
    CREATE OR REPLACE PROCEDURE PRC_TEST IS  
      PROCEDURE PRC_SUB_TEST IS
      BEGIN
      END;
    BEGIN
      PRC_SUB_TEST ;
    END
    这个貌似没问题。  2.异常抛出问题。
      a. WHEN OTHERS THEN 这个 OTHERS 是什么意思?是说随便写一个的?然后这个异常就不管了?
    a-->others你可以理解为其他异常的集合,你不知道具体会发生什么异常就用others去捕获。
      b. RAISE 这是 异常抛出的意思吗?
    b-->RAISE是用以自定义异常抛出是使用。
      c. WHEN NO_DATA_FOUND THEN 这里的 NO_DATA_FOUND 是 系统定义好的异常吗?
    c-->NO_DATA_FOUND是预定义异常。没错
      3.为什么 Oracle 的存储过程中 不能写 SELECT ?
    3-->可以用select * into V_value from T_table where...