2017-04-26 27 views
0

我想使這個代碼動態的,即代替n_numb number:= 1990如果我輸入一個不同的年份,它應該根據你輸入的年份執行。如何使這個代碼動態

set SERVEROUTPUT ON 

declare 

    v_test varchar2(80) := 'BORN'; 
    n_numb number := 1990; 
begin 

    while v_test <> 'Birthday' 
loop 
     if n_numb = 1991 then v_test := 'Birthday'; 
     end if; 
    dbms_output.put_line (v_test||': '||n_numb); 
    n_numb := n_numb + 1; 
    end loop; 

v_test := 'Playschool'; 
    while n_numb < 1994 AND v_test = 'Playschool' loop 
    dbms_output.put_line (v_test||': '||n_numb); 
     n_numb := n_numb + 1; 
end loop; 

v_test := 'Regularschool'; 
    while n_numb < 2007 AND v_test = 'Regularschool' loop 
    dbms_output.put_line (v_test||': '||n_numb); 
     n_numb := n_numb + 1; 
end loop; 

    v_test := 'Engineering'; 
    while n_numb < 2011 AND v_test = 'Engineering' loop 
    dbms_output.put_line (v_test||': '||n_numb); 
     n_numb := n_numb + 1; 
end loop; 

    v_test := 'SearchingJob'; 
    while n_numb < 2013 AND v_test = 'SearchingJob' loop 
    dbms_output.put_line (v_test||': '||n_numb); 
     n_numb := n_numb + 1; 
end loop; 

    v_test := 'Working'; 
    while n_numb < 2014 AND v_test = 'Working' loop 
    dbms_output.put_line (v_test||': '||n_numb); 
     n_numb := n_numb + 1; 
end loop; 
end; 
+1

您可以創建過程並將年份作爲參數傳遞。 – Nitish

+0

目前它不工作,我們改變了一年,首先我們需要修復代碼中的錯誤。 –

+0

代碼中的錯誤是什麼? – Nitish

回答

1

爲了使該代碼需要一年的輸入並打印出基於過去這些年來,您需要更改基於年數活動切換到年-積累

我會在下面添加一些示例。
第一個將修改您的原始代碼以允許切換n_numb
第二個將重構使用procedure s來簡化事情。

對於第一個示例,我將從您的原始代碼開始,並添加一個accumulatorV_YEAR_ACCUMULATION來衡量年份。然後將n_numb更改爲不同的值將得到不同的輸出。

DECLARE 
    V_TEST VARCHAR2(80) := 'BORN'; 
    N_NUMB NUMBER := 1990; 
    V_YEAR_ACCUMULATION NUMBER := 0; 
BEGIN 

    WHILE V_TEST <> 'Birthday' 
    LOOP 
    IF V_YEAR_ACCUMULATION = 1 
    THEN V_TEST := 'Birthday'; 
    END IF; 
    DBMS_OUTPUT.put_line(V_TEST || ': ' || N_NUMB); 
    N_NUMB := N_NUMB + 1; 
    V_YEAR_ACCUMULATION := V_YEAR_ACCUMULATION + 1; 
    END LOOP; 

    V_TEST := 'Playschool'; 
    WHILE V_YEAR_ACCUMULATION < 4 AND V_TEST = 'Playschool' LOOP 
    DBMS_OUTPUT.put_line(V_TEST || ': ' || N_NUMB); 
    N_NUMB := N_NUMB + 1; 
    V_YEAR_ACCUMULATION := V_YEAR_ACCUMULATION + 1; 
    END LOOP; 

    V_TEST := 'Regularschool'; 
    WHILE V_YEAR_ACCUMULATION < 17 AND V_TEST = 'Regularschool' LOOP 
    DBMS_OUTPUT.put_line(V_TEST || ': ' || N_NUMB); 
    N_NUMB := N_NUMB + 1; 
    V_YEAR_ACCUMULATION := V_YEAR_ACCUMULATION + 1; 
    END LOOP; 

    V_TEST := 'Engineering'; 
    WHILE V_YEAR_ACCUMULATION < 21 AND V_TEST = 'Engineering' LOOP 
    DBMS_OUTPUT.put_line(V_TEST || ': ' || N_NUMB); 
    N_NUMB := N_NUMB + 1; 
    V_YEAR_ACCUMULATION := V_YEAR_ACCUMULATION + 1; 
    END LOOP; 

    V_TEST := 'SearchingJob'; 
    WHILE V_YEAR_ACCUMULATION < 23 AND V_TEST = 'SearchingJob' LOOP 
    DBMS_OUTPUT.put_line(V_TEST || ': ' || N_NUMB); 
    N_NUMB := N_NUMB + 1; 
    V_YEAR_ACCUMULATION := V_YEAR_ACCUMULATION + 1; 
    END LOOP; 

    V_TEST := 'Working'; 
    WHILE V_YEAR_ACCUMULATION < 24 AND V_TEST = 'Working' LOOP 
    DBMS_OUTPUT.put_line(V_TEST || ': ' || N_NUMB); 
    N_NUMB := N_NUMB + 1; 
    V_YEAR_ACCUMULATION := V_YEAR_ACCUMULATION + 1; 
    END LOOP; 
END; 
/

並對其進行測試:

使用n_numb := 1990給出:

BORN: 1990 
Birthday: 1991 
Playschool: 1992 
Playschool: 1993 
Regularschool: 1994 
... 
... 
SearchingJob: 2012 
Working: 2013 

n_numb := 1899,您可以:

BORN: 1899 
Birthday: 1900 
Playschool: 1901 
Playschool: 1902 
Regularschool: 1903 

但是,有一些重構,可以簡化事情。
在第二個示例中,我將創建用於執行打印的過程,並隨着時間的推移從一個活動移動到下一個活動。這將需要更少的代碼。

首先,創建一個過程來print當前activity和進步的years

CREATE OR REPLACE PROCEDURE GROW_OLDER(P_ACTIVITY IN VARCHAR2, P_YEARS_TO_CONTINUE IN NUMBER, P_YEARS_ACCUMULATED IN OUT NUMBER) 
IS 
    V_LOCAL_ACCUMULATION NUMBER := 0; 
    BEGIN 
    WHILE V_LOCAL_ACCUMULATION < P_YEARS_TO_CONTINUE LOOP 
     DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('%s: %s',P_ACTIVITY,TO_CHAR(P_YEARS_ACCUMULATED + V_LOCAL_ACCUMULATION))); 
     V_LOCAL_ACCUMULATION := V_LOCAL_ACCUMULATION + 1; 
     END LOOP; 
    P_YEARS_ACCUMULATED := P_YEARS_ACCUMULATED + P_YEARS_TO_CONTINUE; 
    END; 
/

然後創建一個過程來划過來從活動的運動協調的活動:

CREATE OR REPLACE PROCEDURE MOVE_THROUGH_THE_YEARS(P_START_YEAR IN NUMBER) 
IS 
    V_YEAR_ACCUMULATION NUMBER := P_START_YEAR; 
    BEGIN 
    GROW_OLDER('Born', 1, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Birthday', 1, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Playschool', 2, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Regularschool', 13, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Engineering', 4, V_YEAR_ACCUMULATION); 
    GROW_OLDER('SearchingJob', 2, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Working', 1, V_YEAR_ACCUMULATION); 
    END; 
/

然後測試它。開始1990

BEGIN 
    MOVE_THROUGH_THE_YEARS(1990); 
END; 
/

Born: 1990 
Birthday: 1991 
Playschool: 1992 
Playschool: 1993 
Regularschool: 1994 
Regularschool: 1995 
... 
... 
Engineering: 2010 
SearchingJob: 2011 
SearchingJob: 2012 
Working: 2013 

或者2077

BEGIN 
    MOVE_THROUGH_THE_YEARS(2077); 
END; 
/

Born: 2077 
Birthday: 2078 
Playschool: 2079 
Playschool: 2080 
Regularschool: 2081 
Regularschool: 2082 
... 
... 
Engineering: 2097 
SearchingJob: 2098 
SearchingJob: 2099 
Working: 2100 

編輯如果你只是想一次打印每個活動,您可以用不無循環的替代取代上述過程。

CREATE OR REPLACE PROCEDURE GROW_OLDER(P_ACTIVITY IN VARCHAR2, P_YEARS_TO_CONTINUE IN NUMBER, P_YEARS_ACCUMULATED IN OUT NUMBER) 
IS 
    BEGIN 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('%s: %s',P_ACTIVITY,TO_CHAR(P_YEARS_ACCUMULATED))); 
    P_YEARS_ACCUMULATED := P_YEARS_ACCUMULATED + P_YEARS_TO_CONTINUE; 
    END; 
/

CREATE OR REPLACE PROCEDURE MOVE_THROUGH_THE_YEARS(P_START_YEAR IN NUMBER) 
IS 
    V_YEAR_ACCUMULATION NUMBER := P_START_YEAR; 
    BEGIN 
    GROW_OLDER('Born', 1, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Birthday', 1, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Playschool', 2, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Regularschool', 13, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Engineering', 4, V_YEAR_ACCUMULATION); 
    GROW_OLDER('SearchingJob', 2, V_YEAR_ACCUMULATION); 
    GROW_OLDER('Working', 1, V_YEAR_ACCUMULATION); 
    END; 
/

然後對其進行測試:

BEGIN 
    MOVE_THROUGH_THE_YEARS(1990); 
END; 
/

結果:

Born: 1990 
Birthday: 1991 
Playschool: 1992 
Regularschool: 1994 
Engineering: 2007 
SearchingJob: 2011 
Working: 2013 

編輯如果你需要每個活動一行的匿名塊,這裏有一個例子:

DECLARE 
    V_YEARS NUMBER := 1990; 
    BEGIN 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('Born: '||TO_CHAR(V_YEARS))); 
    V_YEARS := V_YEARS + 1; 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('Birthday: '||TO_CHAR(V_YEARS))); 
    V_YEARS := V_YEARS + 1; 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('Playschool: '||TO_CHAR(V_YEARS))); 
    V_YEARS := V_YEARS + 2; 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('Regularschool: '||TO_CHAR(V_YEARS))); 
    V_YEARS := V_YEARS + 13; 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('Engineering: '||TO_CHAR(V_YEARS))); 
    V_YEARS := V_YEARS + 4; 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('SearchingJob: '||TO_CHAR(V_YEARS))); 
    V_YEARS := V_YEARS + 2; 
    DBMS_OUTPUT.put_line(UTL_LMS.FORMAT_MESSAGE('Working: '||TO_CHAR(V_YEARS))); 
    V_YEARS := V_YEARS + 1; 
END; 
/

輸出與所有其他示例相同:

Born: 1990 
Birthday: 1991 
Playschool: 1992 
Regularschool: 1994 
Engineering: 2007 
SearchingJob: 2011 
Working: 2013 
+0

如果我不想輸出重複如BORN :1987 生日:1988年 幼兒園:1989 Regularschool:1991 工程:2004年 SearchingJob:2008 工作:2010 –

+0

感謝您可以打印每個活動一次@RaviTej當然可以。我會用一個例子來更新。 – alexgibbs

+0

@RaviTej我增加了另一個例子,只在帖子的底部打印一行。這是你在找什麼?謝謝 – alexgibbs