如何使此代码动态化
How to make this code dynamic
我想让这段代码动态化,即代替 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;
要使此代码输入年份并根据经过的年数打印出来,您需要切换为根据 年数 更改 activity至 年累计 。
我将在下面添加几个示例。
第一个将修改您的原始代码以允许切换 n_numb
.
第二个将重构使用 procedure
s 来简化事情。
作为第一个示例,我将从您的原始代码开始,并添加一个 accumulator
V_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
但是,有一些重构可以简化事情。
在第二个示例中,我将创建程序来进行打印,并随着时间的推移从一个 activity 移动到下一个。这将需要更少的代码。
首先,创建一个程序到 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;
/
然后创建一个程序来协调这些年来从 activity 到 activity 的运动:
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
EDIT 如果您只想打印每个 activity 一次,您可以将上面的 GROW_OLDER
过程替换为不循环的替代方法。
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
编辑 如果你需要一个每 activity 一行一行的匿名块,这里有一个例子:
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
我想让这段代码动态化,即代替 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;
要使此代码输入年份并根据经过的年数打印出来,您需要切换为根据 年数 更改 activity至 年累计 。
我将在下面添加几个示例。
第一个将修改您的原始代码以允许切换 n_numb
.
第二个将重构使用 procedure
s 来简化事情。
作为第一个示例,我将从您的原始代码开始,并添加一个 accumulator
V_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
但是,有一些重构可以简化事情。
在第二个示例中,我将创建程序来进行打印,并随着时间的推移从一个 activity 移动到下一个。这将需要更少的代码。
首先,创建一个程序到 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;
/
然后创建一个程序来协调这些年来从 activity 到 activity 的运动:
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
EDIT 如果您只想打印每个 activity 一次,您可以将上面的 GROW_OLDER
过程替换为不循环的替代方法。
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
编辑 如果你需要一个每 activity 一行一行的匿名块,这里有一个例子:
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