2012-04-12 5 views
1

오라클 패키지에 익숙하지 않아 컴파일/실행되지 않는 이유를 설명 할 수 있는지 궁금합니다. 오라클 패키지 문제

CREATE OR REPLACE PACKAGE login_pkg IS 
FUNCTION login_ck_pf 
    (p_user IN VARCHAR2, 
    p_pass IN VARCHAR2) 
    RETURN CHAR; 
END; 
/
CREATE OR REPLACE PACKAGE BODY login_pkg IS 
FUNCTION login_ck_pf 
    (p_user IN VARCHAR2, 
    p_pass IN VARCHAR2) 
    RETURN CHAR 
    IS 
    lv_ck_txt CHAR(1) := 'N'; 
    lv_id_num NUMBER(5); 
BEGIN 
    SELECT idShopper 
    INTO lv_id_num 
    FROM bb_shopper 
    WHERE username = p_user 
    AND password = p_pass; 
    IF SQL%FOUND THEN 
    lv_ck_txt := 'Y'; 
    lv_id_num := lv_id_num; 
    END IF; 
    RETURN lv_ck_txt; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('Invalid Login'); 
    lv_ck_txt := 'N'; 
    return lv_ck_txt; 
END; 
END; 
/
show errors; 

execute login_pkg.login_ck_pf('gma1', 'goofy'); 

내가 지금 난 그냥 그것을 호출하는 방법을 알아 내야 컴파일이 지금까지 당신의 도움을 주셔서 감사합니다. 행이 발견되면 나는 Y를 반환 할 그리고 내가 N.에게

PACKAGE login_pkg compiled 
PACKAGE BODY login_pkg compiled 
No Errors. 

Error starting at line 35 in command: 
execute login_pkg.login_ck_pf('gma1', 'goofy') 
Error report: 
ORA-06550: line 1, column 7: 
PLS-00221: 'LOGIN_CK_PF' is not a procedure or is undefined 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+0

답변을 받으면 게시물을 편집하여 새로운 질문을하지 마십시오. 그래서 포럼이 아닌 Q & A 사이트입니다. 스레드 당 하나의 질문이며 질문 당 하나의 답변입니다. 그러니 새로운 질문을하십시오 (적절한 경우 이전 질문에 연결). 질문의 의미를 변경하면 사람들이 혼란스럽고 쓰레기가 오염됩니다. – APC

답변

5

login_ck_pf 함수가 아닌 절차이기 때문에, 당신은 반환 값을 할당 할 변수를 제공하기 위해 필요 해요

SELECT login_pkg.login_ck_pf('gma1','goofy') FROM dual; 
4

을 반환 할 찾을 수없는 경우 다음 당신의 몸 (구현)를 컴파일 할 수 있습니다 먼저 패키지 사양을 작성해야합니다 : 당신은 당신이 사용하기 위해 노출하고자하는 등의 절차, 함수, 상수, 타입의 서명 (인터페이스, API)를 정의 할 경우

CREATE OR REPLACE PACKAGE login_pkg IS 

FUNCTION login_ck_pf 
    (p_user IN VARCHAR2, 
    p_pass IN VARCHAR2) 
    RETURN CHAR; 

END; 
/

패키지 사양

이다. 패키지 본문에는 이러한 정의가 구현되어 있습니다. 명세는 본문 없이도 존재할 수 있지만 본문은 명세 없이는 존재할 수 없습니다. 사양에 정의 된 모든 내용이 본문에 구현되어야합니다. 추가 절차를 명세에 넣지 않고 본문에 정의 할 수 있으며, 그 다음에는 신체 내에서 사용하기위한 "개인적인"절차로 사용되며 외부 사용에는 사용할 수 없습니다.

나는 우리가 몸 상태에있는 동안 몇 가지 다른 것들이 있다고 생각한다. 어디서나 lv_id_num 또는 pv_id_num이 사용되는 것을 볼 수 없습니다. 행이 발견되지 않으면 "if sql % found"가 표시된 코드 블록도 히트되거나 예외 핸들러로 바로 갈 것입니까? 예외 처리기가 호출되면 'N'값을 반환 하시겠습니까? 이 시점에서 당신이 해킹하고 있다는 것을 알기 때문에 몇 가지 아이디어 만 있습니다. 당신이 할 수있는, 또는

DECLARE 
    v_ret CHAR(1); 
BEGIN 
    v_ret := login_pkg.login_ck_pf('gma1','goofy'); 
    DBMS_OUTPUT.PUT_LINE(v_ret); 
END; 
/

:

+0

출력 결과 패키지가 실행되고 컴파일 된 것으로 나타납니다. 문제는 분명히 @DanA가 말합니다 : LOGIN_CK_PF는 함수로 정의되었지만 OP는 프로 시저 인 것처럼 OP를 호출하려고합니다. – APC

+0

@ APC이 응답은 사양이 없기 때문에 패키지가 컴파일되지 않은 원래 버전의 질문에 대한 것입니다. – Glenn

+0

미안하지만, OP가 질문을 편집 한 것을 알지 못했습니다. 당신의 대답을 사소한 편집으로 만들어서 당신을 풀 수 있습니다. – APC