create or replace FUNCTION CARD_NUM_ENC (CARD_NUM VARCHAR2)
RETURN VARCHAR2
IS
CARD_NUMBER VARCHAR2(60);
CARD_NUMBER2 VARCHAR2(128);
BEGIN
select substr(card_no,7,8) INTO card_number from CARD;
card_number := pi_encrypt(card_number);
select substr(card_no,1,6) || card_number || substr(card_no,13,15) INTO card_number2 from card;
card_number2 := card_number2;
RETURN card_number2;
END;
대학교 재학중인 학생입니다. 문자열을 substr 잘라서 concat으로 붙인 뒤 부분 암호화를 실행하는 함수를 작성하였습니다.
여기서 문제가 파라미터로 null값 또는 7자리 이하가 넘어올 경우 로직을 어떻게 변경해야할까요??...
그리고 컬럼에 데이터가 2개 이상이면 함수가 써지지 않는데 어떻게하면 좋을까요?? 아직 초보라서 질문으로 이해를 시켜드리지 못하네요..
CREATE OR REPLACE FUNCTION f_card_num_enc(card_num VARCHAR2) RETURN VARCHAR2 IS invalid_card_num_error EXCEPTION; v_card_number VARCHAR2(128) BEGIN IF card_num IS NULL OR LENGTH(card_num) <= 7 THEN RAISE invalid_card_num_error; END IF; -- 테이블을 읽어야 하는 함수가 아닌 듯 하네요. -- v_card_number := SUBSTR(card_num, 1, 6) || pi_encrypt(SUBSTR(card_num, 7, 8)) || SUBSTR(card_num, 13, 15) -- 잘라내는 자리수 맞는지 의문?(앞자리와 겹침) ; RETURN v_card_number; EXCEPTION WHEN invalid_card_num_error THEN RAISE_APPLICATION_ERROR(-20001, '카드번호 입력 오류'); END; /
http://gurubee.net/oracle/plsql
http://gurubee.net/lecture/1073
파라메터로 받는 CARD_NUM을 가공하여 리턴해야하는 것 아닌가요? CARD_NUM은 전혀 사용하고 있지 않습니다.
만약 CARD 테이블에서 CARD_NO가 CARD_NUM인 데이터를 찾아 가공하는 것이라면
굳이 CARD 테이블을 조회할 필요가 없어보이구요.
만약 CARD 테이블에 해당 자료가 있는지 확인하고 암호화하여 리턴하는 것이라면 WHERE절에 ROWNUM = 1 정도로 제한을 걸어야겠습니다.
현재 로직에서는 CARD 테이블에서 조회되는 여러개의 값을 CARD_NUMBER 변수에 저장할 수 없기 때문에 오류가 날 것입니다.
PI_ENCRYPT 함수는 사용자 함수인가보죠?
파라메터가 7자리 이하거나 NULL이 들어올 경우에는 EXCEPTION을 사용하여 오류를 발생시키거나
리턴 값으로 'ERROR' 등의 값을 전달하시면 되겠습니다.
우선은 함수가 실행해야할 내용을 명확히 설명해주셔야할 것 같네요.
여러 개의 값을 단일 변수 CARD_NUMBER에 담을 수는 없습니다.
일반 개발언어로 이야기 하자면
string sCardNumber를 정의하고
sCardNumber는 "123" 이기도 하고 "456" 이기도 하고 "789"이기도 하다. 라고 할당할 수 없는 것과 동일합니다.
쿼리는 집합 언어이기 때문에 쿼리 결과는 하나일 수도 있고 여러개일 수도 있습니다.
여러개의 결과가 나오는 쿼리에 대하여는 커서를 사용하여 하나의 row씩 데이터를 읽고
하나의 row마다 데이터를 처리해야합니다.
말씀 드렸듯이 해당 function이 어떤 값을 받아 어떤 처리를 하고 어떤 결과를 리턴하여야하는지
명확히 정의해주시기 전에는 정확히 답변 드리기 어려울 것 같네요.