database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40700 게시물 읽기
No. 40700
ID중복검사..를 하고싶은데요. 지적부탁드립니다.
작성자
newbie
작성일
2015-01-30 09:31
조회수
7,827

밑에처럼 작성하고 나면 컴파일 되었습니다. 와 함께 errors :  check compiler log  라고 나오는데 

잘못된 부분이 있으면 지적부탁드립니다.

 


 

create or replace function login_check(

                           oper_id in varchar2,

                           o_errno out number,

                           o_msg out varchar2

                           )

RETURN number 

IS

   o_len1           number;

   o_id             varchar2(10);

   

   

begin 

   o_len1 := length(oper_id);

   oper_id := '';

   o_errno := -1;

   o_msg   :='오류';

   

 

   if o_len1 is null then

      o_errno := -2;

      o_msg := '아이디를 입력하세요';

      return -2;

   end if;

 

   if o_len1  >10 then

      o_errno := -3;

      o_msg := '아이디는 10자 이하입니다.';

      return -3;

   end if;

    

   begin 

      select oper_id

        into o_id

        from jk_operator;

   

    exception 

         when NO_DATA_FOUND then

            o_errno := -4;

            o_msg := '운영자 정보가 존재하지 않습니다';

            return -4;

    end; 

  

    if v_id = i_login_id then

      o_errno := 0;

      o_msg := '접속 성공';

      return 0;

   end if; 

 

   o_errno := -5;

   o_msg := '등록된 아이디가 아닙니다.';

   return -5;

  

exception 

     when others then

        o_errno := -6;

        o_msg :=  SQLERRM || '(' || to_char(SQLCODE) || ')';

        return -6;

     

 

이 글에 대한 댓글이 총 2건 있습니다.

 틀린 곳이 몇군데 있는데요...

1) 마지막에 end; 빠짐

2)  oper_id := '';   ==> in 타입 인자에 할당 불가.

3) v_id 와 I_LOGIN_ID 는 선언되지 않은 변수

4) 만약 jk_operator 테이블에 행이 2행 이상이면 too_many_rows 오류

 

등이 형식적인 오류구요...

그외에도 이 프로그램으로는 사용자를 인증하는 것이 불가능한 논리 오류가 있습니다.

김흥수(protokhs)님이 2015-01-30 14:45에 작성한 댓글입니다.

 프로그램을 수정하여 올립니다.

참고 하십시오.

 

 create or replace function login_check(

                           i_oper_id in varchar2,
                           o_errno out number,
                           o_msg out varchar2
                           )
RETURN number 
IS
   o_len1           number;
   o_id             varchar2(10);
   v_id             VARCHAR2(10);
   I_LOGIN_ID       VARCHAR2(10);
   --암호 검사가 없습니다.
begin 
   o_len1 := length(i_oper_id);
   o_errno := -1;
   o_msg   :='오류';
   
 
   if i_oper_id is null then
      o_errno := -2;
      o_msg := '아이디를 입력하세요';
      return -2;
   end if;
 
   if o_len1  > 10 then
      o_errno := -3;
      o_msg := '아이디는 10자 이하입니다.'; --id에 대한 추가적인 정보를 알려주는 에러 메시지는 보안에 취약합니다.
      return -3;
   end if;
    
   begin 
      select a.oper_id
        into o_id
        from jk_operator a
        where a.oper_id =  i_oper_id;
   
    exception 
         when NO_DATA_FOUND then
           o_errno := -5;
           o_msg := '등록된 아이디가 아닙니다.';    --등록된 id가 없는 것인지 아니면 운영자 정보가 없는 것인지에 대한 요건이 불분명합니다.
           return -5;
    end; 
  
  o_errno := 0;
  o_msg := '접속 성공';
  return 0;
  
exception 
     when others then
        o_errno := -6;
        o_msg :=  SQLERRM || '(' || to_char(SQLCODE) || ')';
        return -6;
END;
/
 

 

김흥수(protokhs)님이 2015-01-30 16:10에 작성한 댓글입니다.
이 댓글은 2015-01-30 16:12에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
40703DB 날짜 등록하기 [1]
조성찬
2015-02-02
7246
40702DB로 날짜 검색 [3]
조성찬
2015-01-30
8302
40701oracle로 1차 연립방정식 풀기 [2]
김흥수
2015-01-30
8674
40700ID중복검사..를 하고싶은데요. 지적부탁드립니다. [2]
newbie
2015-01-30
7827
40699조건부 count 쿼리 도와주세요 [2]
박용대
2015-01-29
7021
40698쿼리를 자주 안쓰면 느리게 되는 걸 어떻게 막죠? [1]
김삼
2015-01-29
8126
40697fetch 속도가 너무 느립니다. 고속fetch 어떻게 하나요? [1]
신창식
2015-01-28
7553
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다