首先想问问,那里有关于存储过程,触发器之类的学习资料,谢了~另外想实现一个很简单的存储过程
表A里有一个字段ID,从1,2,3..........大概有几万把,有些记录可能被删除了,
现在想得到最小的那个未被使用的ID,该如何写比如,目前的ID是:1,2,3,5,6,8,9...我要得到4
2,3,5,6,8...我要得到1 (1是最小的)

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/4908/4908137.xml?temp=.9207117
    lz参照一下
    跟你的问题差不多
    你只不过取min()而已
      

  2.   


    SQL> SELECT * FROM TMP ORDER BY ID;        ID NAME
    ---------- ----------
             1 A
             4 A
             6 A
             8 A
            10 BSQL> DECLARE
      2    MINV NUMBER;
      3    MAXV NUMBER;
      4    I NUMBER;
      5    ICOUNT NUMBER;
      6    BEGIN
      7      SELECT MIN(ID) INTO MINV FROM TMP;
      8      SELECT MAX(ID) INTO MAXV FROM TMP;
      9      FOR I IN MINV..MAXV
     10      LOOP
     11        SELECT COUNT(1) INTO ICOUNT FROM TMP WHERE ID=I;
     12        IF ICOUNT=0 THEN
     13          DBMS_OUTPUT.PUT_LINE(I);
     14        END IF;
     15      END LOOP;
     16    END;
     17  /
    --------------------------
    方法不错,怎么把这个写成存储过程呢?我只要得到DBMS_OUTPUT.PUT_LINE(I);里最小的一个值
    谢了!!!
      

  3.   

    create or replace PROCEDURE proc_1
    as 
      MINV NUMBER;
      MAXV NUMBER;
      I NUMBER;
      ICOUNT NUMBER;
    .....
    ......
    .....
      

  4.   

    create or replace procedure ID is
           MINV NUMBER;
           MAXV NUMBER;
           I NUMBER;
           ICOUNT NUMBER;
    begin
      
             SELECT MIN(k.id) INTO MINV FROM ad k;
             SELECT MAX(k.id) INTO MAXV FROM ad k;
             FOR I IN MINV..MAXV
             LOOP
               SELECT COUNT(1) INTO ICOUNT FROM ad k WHERE k.id=I;
               IF ICOUNT = 0 THEN
                 DBMS_OUTPUT.PUT_LINE(I);
                 
               END IF;
              END LOOP;
             
    end ID;
    我测试的结果是:
    1
    4
    6
    ....我就是这么写的,但我现在需要得到一个值,最小的那个值,要有一个输出的那种,例如:
    create or replace procedure ID(pno_result  out number) is
           MINV NUMBER;
           MAXV NUMBER;
           I NUMBER;
           ICOUNT NUMBER;
    ....................
    就是问这个pno_result := 该怎么写???谢了
      

  5.   

    你第一个输出的就是最小的了
    IF ICOUNT = 0 THEN
       DBMS_OUTPUT.PUT_LINE(I);
       break;          
    END IF;
      

  6.   

    呵呵,break;可以用吗??我也这样用过,结果:Error: PLS-00201: 必须说明标识符 'BREAK'
    Line: 17
    Text: break;Error: PL/SQL: Statement ignored
    Line: 17
    Text: break;
      

  7.   

    ^_^, exit;可以了,但我调用时这个结果传不过去我还是要得到一个输出值啊,方便以后用这个数据的用户,他们可以用应用程序来调用我的存储过程实现添加数据的功能create or replace procedure ID(pno_result  out number) is
    ......
      

  8.   


    IF ICOUNT = 0 THEN
       DBMS_OUTPUT.PUT_LINE(I);
       pno_result := I;
       exit;          
    END IF;