pl/sql 공부하다가 저를 포함한 많은 분들께 유용할 것 같아서 만든 수열 pl/sql 쿼리문입니다.
---필요한 상황
문제x번. * 를 20개부터 19, 18.. 1개까지 거꾸로 나오게 출력하는데 * 4개는 출력되지 않게 하세요.

위 문제처럼 loop 문을 어떻게 짤지 망설여진다면 help 수열 봇이 도와줄 수 있습니다.
---사용법
1. 원하는 수열과 숫자 2개 or 숫자 5개 입력하세요(예: 등차,1,2 or 1,2,3,4,5)
문제가 되는 수열을 입력하시면 됩니다.
방법 1. 등차,20,19 을 입력한다. -> 첫번째 숫자가 20, 두번째 숫자가 19인 등차수열의 식을 보여줍니다.(등비수열도 가능)
방법 2. 20,19,18,17,16 입력한다. -> 원하는 수열을 5개까지 입력하면 자동으로 등차 or 등비 or 계차 수열인지 파악해서 식 을 보여줍니다.
2. 입력하신 i 번째 수열값을 보여드립니다.<i 입력, 없으면 1 입력>
i번째 수열값이 궁금한 경우 원하는 i를 입력하시면 됩니다.
단, 0을 치면 오류가 날 수 있으니 그냥 패스하고 싶으시면 1을 치면 됩니다.
3. 입력하신 수열값이 몇 번째 수인지 보여드립니다.<수열값 입력, 없으면 1 입력>
별 4개 짜리가 몇 번째 수인지.. 도통 생각나지 않을 경우 원하는 수열값 4를 입력하시면 몇번재 수인지 알려드립니다.
마찬가지로, 0을 치면 오류가 날 수 있으니 패스하고플 땐 1을 입력하세요.
---사용예

또는

이렇게 하시면 됩니다.

--- pl/sql문
현재까지 등차, 등비, 계차수열까지 구현됩니다. (다른 수열은 너무 어렵..)
pl/sql 연습하고픈 분들 한번 짜보시면 실력이 향상될거에요.
그리고 사용 중 불편사항 있으시면 피드백 부탁드려요.
점차 개선해서 loop 문의 원활한 사용에 기여하겠습니다.
set serveroutput on;
set verify off;
set lines 1000;
set pages 1000;
accept p_0 prompt '1. 원하는 수열과 숫자 2개 or 숫자 5개 입력하세요(예: 등차,1,2 or 1,2,3,4,5) '
accept p_i prompt '2. 입력하신 i 번째 수열값을 보여드립니다.<i 입력, 없으면 1 입력> '
accept p_f prompt '3. 입력하신 수열값이 몇 번째 수인지 보여드립니다.<수열값 입력, 없으면 1 입력> '
declare
v_0 varchar2(100) := replace('&p_0',' ','');
v_1 number(20,5) := regexp_substr(v_0,'[^,가-힣]+',1,1);
v_2 number(20,5) := regexp_substr(v_0,'[^,가-힣]+',1,2);
v_3 number(20,5) := regexp_substr(v_0,'[^,가-힣]+',1,3);
v_4 number(20,5) := regexp_substr(v_0,'[^,가-힣]+',1,4);
v_5 number(20,5) := regexp_substr(v_0,'[^,가-힣]+',1,5);
v_i number(20) := &p_i;
v_f number(20) := &p_f;
v_d number(20);
v_n varchar2(100) := regexp_substr(v_0,'[^,]+',1,1);
v_11 number(20,5) := regexp_substr(v_0,'[^,]+',1,2);
v_22 number(20,5) := regexp_substr(v_0,'[^,]+',1,3);
v_r1 number(20,5);
v_r2 number(20,5);
begin
if v_n = '등차' then
v_d := (v_22 - v_11);
v_r1 := v_11 - v_d + (v_i * v_d) ;
v_r2 := (v_f - v_11 + v_d)/ (v_d);
dbms_output.put_line(chr(10)||chr(10)||'1. 해당 수열은 '||v_n||' 수열입니다.');
dbms_output.put_line(chr(10)||'2. '||v_i ||' 번째 수열값은 '|| v_r1 ||' 입니다. ');
dbms_output.put_line(chr(10)||'3. 수열값 '|| v_f ||' 는 '|| v_r2 || ' 번째 수입니다.');
dbms_output.put_line(chr(10)||'4. PL/SQL 변수 할당 방식은 v_num := v_num + ('|| v_d ||') ; 입니다.');
dbms_output.put_line(chr(10)||'5. 해당 수열의 일반식은 f(i) = (' || (v_11 - v_d) || ') + ('|| v_d || ') * i 입니다.');
elsif v_n = '등비' then
v_d := (v_22/v_11);
v_r1 := v_11 * power(v_d,v_i -1);
v_r2 := (ln(v_f/v_11)/ln(v_d)) +1;
dbms_output.put_line(chr(10)||chr(10)||'1. 해당 수열은 '||v_n||' 수열입니다.');
dbms_output.put_line(chr(10)||'2. '||v_i ||' 번째 수열값은 '|| v_r1 ||' 입니다. ');
dbms_output.put_line(chr(10)||'3. 수열값 '|| v_f || ' 는 '|| v_r2 || ' 번째 수입니다.');
dbms_output.put_line(chr(10)||'4. PL/SQL 변수 할당 방식은 v_num := v_num * ('|| v_d ||') ; 입니다.');
dbms_output.put_line(chr(10)||'5. 해당 수열의 일반식은 f(i) = (' || v_11 || ' * power('||v_d||', i-1)) 입니다.');
else
if (v_2 - v_1) = (v_3 - v_2) and (v_3 - v_2) = (v_4 - v_3) and (v_4 - v_3) = (v_5 - v_4) then
v_d := (v_2 - v_1);
v_n := '등차';
v_r1 := v_1 - v_d + (v_i * v_d) ;
v_r2 := (v_f - v_1 + v_d)/ (v_d);
dbms_output.put_line(chr(10)||chr(10)||'1. 해당 수열은 '||v_n||' 수열입니다.');
dbms_output.put_line(chr(10)||'2. '||v_i ||' 번째 수열값은 '|| v_r1 ||' 입니다. ');
dbms_output.put_line(chr(10)||'3. 수열값 '|| v_f ||' 는 '|| v_r2 || ' 번째 수입니다.');
dbms_output.put_line(chr(10)||'4. PL/SQL 변수 할당 방식은 v_num := v_num + ('|| v_d ||') ; 입니다.');
dbms_output.put_line(chr(10)||'5. 해당 수열의 일반식은 f(i) = (' || (v_1 - v_d) || ') + ('|| v_d || ') * i 입니다.');
elsif (v_2/v_1) = (v_3/v_2) and (v_3/v_2) = (v_4/v_3) and (v_4/v_3) = (v_5/v_4) then
v_d := (v_2/v_1);
v_n := '등비';
v_r1 := v_1 * power(v_d,v_i -1);
v_r2 := (ln(v_f/v_1)/ln(v_d)) +1;
dbms_output.put_line(chr(10)||chr(10)||'1. 해당 수열은 '||v_n||' 수열입니다.');
dbms_output.put_line(chr(10)||'2. '||v_i ||' 번째 수열값은 '|| v_r1 ||' 입니다. ');
dbms_output.put_line(chr(10)||'3. 수열값 '|| v_f || ' 는 '|| v_r2 || ' 번째 수입니다.');
dbms_output.put_line(chr(10)||'4. PL/SQL 변수 할당 방식은 v_num := v_num * ('|| v_d ||') ; 입니다.');
dbms_output.put_line(chr(10)||'5. 해당 수열의 일반식은 f(i) = (' || v_1 || ' * power('||v_d||', i-1)) 입니다.');
elsif (v_3 - v_2 ) - (v_2 - v_1) = (v_4 - v_3) - (v_3 - v_2) and (v_4 - v_3) - (v_3 - v_2) = (v_5 - v_4) - (v_4 - v_3) then
v_d := (v_3 - v_2) - (v_2 - v_1);
v_n := '계차';
v_r1 := v_1 + (((2*(v_2 - v_1) + ((v_i -2) * v_d)) * (v_i -1))/ 2 );
dbms_output.put_line(chr(10)||chr(10)||'1. 해당 수열은 '|| v_n ||' 수열입니다.');
dbms_output.put_line(chr(10)||'2. '|| v_i ||' 번째 수열값은 '|| v_r1 ||' 입니다. ');
dbms_output.put_line(chr(10)||'3. 수열값 '|| v_f || ' 는 너무 어려워서 몇 번째 수인지 모르겠어요.');
dbms_output.put_line(chr(10)||'4. PL/SQL 변수 할당 방식은 너무 어려워서 패스!');
dbms_output.put_line(chr(10)||'5. 해당 수열의 일반식은 f(i) = (' ||(v_1)|| ') + (((2 * ('||(v_2-v_1)||') + (i-2) * '||(v_d)||') * (i-1))/2)');
else
v_d := 0 ;
v_n := '지원되지 않는';
dbms_output.put_line(chr(10)||'해당 수열은 '|| v_n ||' 수열입니다.');
end if;
end if;
end;
/