오라클 함수 질문드립니다 0 8 730

by saluki [PL/SQL] [2022.02.21 11:11:34]


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개 이상이면 함수가 써지지 않는데 어떻게하면 좋을까요?? 아직 초보라서 질문으로 이해를 시켜드리지 못하네요..

by 마농 [2022.02.21 13:16:21]
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
 


by saluki [2022.02.21 13:43:58]

테이블을 읽어야 할 함수가 따로 정의를 해주어야하는 것인가요??....


by 마농 [2022.02.21 14:06:26]

따로 있는게 아니라,
원하는 요구사항에 따라 결정되는 것입니다.
질문의 요구사항이나 작성된 코드를 보고 제가 짐작하여 판단한 것입니다.
요구사항이 모호하니. 좀 더 구체적으로 적어 주셔야 합니다.


by saluki [2022.02.21 14:11:00]

칼럼에 여러 데이터가 들어갔을 경우 작성한 함수를 호출 시 1개의 데이터 일 때는 함수가 호출되지만 여러개의 데이터가 있을 때 에러가 나고있습니다 하나의 컬럼만 데이터만 리턴해주어서 그런 것 같은데 혹시 여러 데이터가 들어가 있을 경우 함수 실행시 오류가 나지 않고 함수가 정상적으로 호출되는 방법을 알고싶습니다.. 질문의 의도를 자세히 이해시켜드리지 못해서 죄송합니다..


by 마농 [2022.02.21 14:16:59]

지금 작성하신 코드는 뭔가 많이 이상합니다.
단순하게 "여러건의 자료를 가져와 처리하고 싶다" 라는 부분만 보고
자세하게 답변드릴 수가 없습니다.
이상한 부분들 많이 고쳐져야 합니다.
"여러건의 자료를 가져와 처리하고 싶다" 라는 부분에 대한 답을 드리자면
커서를 이용하시면 됩니다.
위 댓글의 참조 링크 확인하세요.


by jkson [2022.02.21 13:18:26]

파라메터로 받는 CARD_NUM을 가공하여 리턴해야하는 것 아닌가요? CARD_NUM은 전혀 사용하고 있지 않습니다.

만약 CARD 테이블에서 CARD_NO가 CARD_NUM인 데이터를 찾아 가공하는 것이라면

굳이 CARD 테이블을 조회할 필요가 없어보이구요.

만약 CARD 테이블에 해당 자료가 있는지 확인하고 암호화하여 리턴하는 것이라면 WHERE절에 ROWNUM = 1 정도로 제한을 걸어야겠습니다.

현재 로직에서는 CARD 테이블에서 조회되는 여러개의 값을  CARD_NUMBER 변수에 저장할 수 없기 때문에 오류가 날 것입니다.

PI_ENCRYPT 함수는 사용자 함수인가보죠?

파라메터가 7자리 이하거나 NULL이 들어올 경우에는 EXCEPTION을 사용하여 오류를 발생시키거나

리턴 값으로 'ERROR' 등의 값을 전달하시면 되겠습니다.

우선은 함수가 실행해야할 내용을 명확히 설명해주셔야할 것 같네요.


by saluki [2022.02.21 13:45:19]

혹시 여러개의 값을 CARD_NUMBER 변수에 저장하기 위해선 어떠한 방법을 써야하나요??..


by jkson [2022.02.21 15:48:22]

여러 개의 값을 단일 변수 CARD_NUMBER에 담을 수는 없습니다.

일반 개발언어로 이야기 하자면

string sCardNumber를 정의하고

sCardNumber는 "123" 이기도 하고 "456" 이기도 하고 "789"이기도 하다. 라고 할당할 수 없는 것과 동일합니다.

쿼리는 집합 언어이기 때문에 쿼리 결과는 하나일 수도 있고 여러개일 수도 있습니다.

여러개의 결과가 나오는 쿼리에 대하여는 커서를 사용하여 하나의 row씩 데이터를 읽고

하나의 row마다 데이터를 처리해야합니다.

말씀 드렸듯이 해당 function이 어떤 값을 받아 어떤 처리를 하고 어떤 결과를 리턴하여야하는지

명확히 정의해주시기 전에는 정확히 답변 드리기 어려울 것 같네요.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입