题目如下
编写一个算命的过程,接收输入的一个生日(yyyymmdd),每2位相加取个位,最后得到一位数字,此数字为偶数(命好),为质数(一般),否则为(命运悲惨).算法如下:
                  19850324
 0735356
  708881
   78669
    5425
     967
      53
       8  -------------------偶数,命好好纠结 刚学ORACLE 的过程和函数不是很会 ,求解谢谢了...

解决方案 »

  1.   

    写了一段代码,有错,没改出来,先贴出来明天在看看了~~
    查出了错误说下理由啊 谢谢-- test code
    DECLARE
    v_birthday VARCHAR2(8):='19999999';
    v_res      VARCHAR2(8):='';
    v_length   NUMBER(2):=0;
    BEGIN
        LOOP
            SM_PRC(v_birthday,v_res);
            v_virthday:=v_res;
            BEGIN
                SELECT length(v_virthday) INTO v_length FROM dual;
            END;
            EXIT WHEN v_length=1;
        END LOOP;
        dbms_output.put_line(v_res);
    END;--procedure
    CREATE OR REPLACE PROCEDURE SM_PRC(inp_birthday IN VARCHAR2, v_res OUT VARCHAR2) IS
    CURSOR getTwoNumAdd(v_data VARCHAR2, v_length NUMBER) IS
    SELECT MOD((num+SECOND),10)
    FROM(
        SELECT num,lead(num) over(ORDER BY i_level) SECOND 
        FROM(
            SELECT substr(v_data,i_level,1) num, i_level
            FROM (
                    SELECT LEVEL i_level FROM dual CONNECT BY LEVEL < v_length
                )
           )
    );v_birthday VARCHAR2(8);
    v_check    CHAR;
    v_temp     VARCHAR2(8);
    BEGIN   v_birthday := inp_birthday;    BEGIN
            SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, '          ')),'Y') INTO v_check  FROM dual
       --EXCEPTION WHEN no_data_found THEN
        --    RETURN;
        END;    IF v_check<>'Y' THEN
            dbms_output.put_line('input parameter has non-numper arph,please check. ' || inp_birthday);
            v_rec:= NULL;
            RETURN;
        END IF;    -- get the parameter's length
        BEGIN
            SELECT length(v_birthday) INTO v_length FROM dual;
        --EXCEPTION WHEN THEN
        END;
        
        FOR v_temp IN getTwoNumAdd(v_birthday,v_length)LOOP
            v_rec := v_res||v_temp;
        END LOOP;END SM_PRC;-- err infomation:
    /*
    Compilation errors for PROCEDURE SYS.SM_PRCError: PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
            begin case declare
              end exception exit for goto if loop mod null pragma raise
              return select update while with <an identifier>
              <a double-quoted delimited-identifier> <a bind variable> <<
              close current delete fetch lock insert open rollback
              savepoint set sql execute commit forall merge pipe
    */
      

  2.   

    public static void testLife() {
    String oldNum = "19850324";
    String newNum = "";
    int firstNum = 0;
    int secondNum = 0;
    while (oldNum.length() > 1) {
    for (int i = oldNum.length(); i > 1; i--) {
    firstNum = Integer.parseInt(oldNum.substring(i - 1, i));
    secondNum = Integer.parseInt(oldNum.substring(i - 2, i - 1)); if ((firstNum + secondNum) > 9) {
    newNum = String.valueOf(firstNum + secondNum).substring(1)
    + newNum;
    } else {
    newNum = firstNum + secondNum + newNum;
    }
    }
    oldNum = newNum;
    newNum = "";
    } ;

    switch(Integer.parseInt(oldNum))
    {
    case 0:
    System.out.println("命好");
    break;
    case 2:
    System.out.println("命好");
    break;
    case 4:
    System.out.println("命好");
    break;
    case 6:
    System.out.println("命好");
    break;
    case 8:
    System.out.println("命好");
    break;
    case 9:
    System.out.println("命一般");
    break;
    default:
    System.out.println("命运悲惨");
    break;
    }

    }
    java测试下哈哈,不知道怎么算质数只能这样判断。
      

  3.   

     BEGIN
            SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, '          ')),'Y') INTO v_check  FROM dual--没分号
       --EXCEPTION WHEN no_data_found THEN
        --    RETURN;
        END;
      

  4.   

     BEGIN
            SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, '          ')),'Y') INTO v_check  FROM dual  --没分号
       --EXCEPTION WHEN no_data_found THEN
        --    RETURN;
        END;
      

  5.   

    函数改了一下,编译通了,如下:CREATE OR REPLACE PROCEDURE SM_PRC(inp_birthday IN VARCHAR2, v_res OUT VARCHAR2) IS
    --cursor
    CURSOR getTwoNumAdd(v_data VARCHAR2, v_length NUMBER) IS
    SELECT to_char(MOD((num+SECOND),10)) a
    FROM(
        SELECT num,lead(num) over(ORDER BY i_level) SECOND 
        FROM(
            SELECT substr(v_data,i_level,1) num, i_level
            FROM (
                    SELECT LEVEL i_level FROM dual CONNECT BY LEVEL <= v_length
                )
           )
    );v_birthday VARCHAR2(8);
    v_check    CHAR;
    v_temp     VARCHAR2(8);
    v_length   NUMBER(2,0);
    v_result   VARCHAR2(8):=' ';
    BEGIN   v_birthday := inp_birthday;    -- check the parameter
        BEGIN
            SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, '          ')),'Y') INTO v_check  FROM dual;
        EXCEPTION WHEN no_data_found THEN
            dbms_output.put_line('input parameter is invalid');
            v_res:='null';
            RETURN;
        END;    IF v_check<>'Y' THEN
            dbms_output.put_line('input parameter has non-numper arph,please check. ' || inp_birthday);
            v_res:= NULL;
            RETURN;
        END IF;
         dbms_output.put_line(v_birthday);
        -- get the parameter's length
        BEGIN
            SELECT length(v_birthday) INTO v_length FROM dual;
        EXCEPTION WHEN OTHERS THEN
            dbms_output.put_line('some error currence, please try again. ');
        END;
        
        FOR v_temp IN getTwoNumAdd(v_birthday,v_length)LOOP
            v_result := trim(v_result||v_temp.a);
        END LOOP;
        v_res:=v_result;
    END SM_PRC;
    ------------------------------------------------------------------------------
    -- test codeDECLARE
    v_birthday VARCHAR2(8):='19850324';
    v_res      VARCHAR2(8):='';
    v_length   NUMBER(2):=0;
    v_length_res   NUMBER(2):=0;BEGIN
        LOOP
            SM_PRC(v_birthday,v_res);
            v_birthday:=trim(v_res);
            
            BEGIN
                SELECT length(v_birthday) INTO v_length FROM dual;
            END;
            EXIT WHEN v_length=1;
        END LOOP;dbms_output.put_line('the result is: '||v_birthday);
    END;
    --------------------------------------------------------------
    --result
    --
    /*
    19850324
    0735356
    708881
    78669
    5425
    967
    53
    the result is: 8
    ***/
      

  6.   

    --结果判断重写了一下:
    DECLARE
    v_birthday VARCHAR2(8):='19851001';
    v_res      VARCHAR2(8):='';
    v_length   NUMBER(2):=0;
    v_length_res   NUMBER(2):=0;BEGIN
        LOOP
            SM_PRC(v_birthday,v_res);
            v_birthday:=trim(v_res);
            
            BEGIN
                SELECT length(v_birthday) INTO v_length FROM dual;
            END;
            EXIT WHEN v_length=1;
        END LOOP;    BEGIN
            SELECT decode(v_birthday,
                            '0','good',
                            '2','good',
                            '4','good',
                            '6','good',
                            '8','good',
                            '1','ok',
                            '3','ok',
                            '5','ok',
                            '7','ok',
                            '7','bad'
                          ) res
            INTO v_res  
            FROM dual;
        EXCEPTION WHEN OTHERS THEN
            dbms_output.put_line('error, failed');
            v_res := NULL;
        END;    dbms_output.put_line('the result is: '||v_res);
    END;