2011-07-29 6 views
1

SQL * Plus 스크립트에 대한 약간의 도움이 필요합니다. 변수를 허용하고 일치하는 테이블을 확인하고 발견하면 출구 프로그램을 종료하고 나머지 승인 문의를 계속하지 않을 수 있도록 할 수있는 방법이 있습니까?Oracle SQL * Plus ACCEPT 문

지금까지이 코드가 있습니다

ACCEPT p_cname PROMPT 'Enter Customer Name: ' 
DECLARE 
    v_cname CHAR(20); 
BEGIN 
    SELECT cname INTO v_cname 
      FROM customer 
    WHERE cname = '&p_cname'; 

    IF v_name = '&p_cname' THEN 
      -- Exit the program 
    END IF; 
END; 
/

-- Other ACCEPT statements if a match was not found. 

내가 일치하는 항목이 발견되는 경우에는 프로그램의 나머지 부분을 계속하지 않으려합니다. 이 일을하는 방법이 있습니까?

+0

마지막 줄의 레이블 + 레이블의 끝까지? – Sathya

답변

1

빠른 대답은 "나쁘다"입니다. SQL * Plus는 매우 간단한 클라이언트입니다. 쿼리 또는 PL/SQL 블록을 서버에 던져서 반환하는 데이터 세트를 표시 할 수 있지만 SQL 또는 PL/SQL이 아닌 SQL * Plus는 IF 또는 반복적 인 루프 구조와 같은 일반 조건문을 갖지 않습니다.

SQL * Plus를 사용하는 대신 Perl 또는 Python과 같은 스크립팅 언어를 고려해야합니다.

+1

그러나 SQL * Plus에서 PL/SQL 블록을 실행할 수 있으므로 거기에 IF 구문을 사용할 수 있습니다. –

0

왜 단순히 조건을 바꾸지 않으시겠습니까? 게리는 스크립트까지 솔루션을 필요합니다 올 더 ELSE 부분

+0

이 경우에 추가 ACCEPT 문을 수행하기를 원하기 때문에 PL/SQL 블록 내에있을 수 없습니다. –

0

이 없기 때문에 v_name 입력과 일치 않을 경우

IF v_name <> '&p_cname' THEN 
     -- Do whatever you want 
END IF; 

그런 식으로 아무것도 일어나지 않습니다. 당신은 (나는 또한 1로 결과를 제한하는 것) 입력 매개 변수 를 얻을 수 & 1을 사용할 수있는 스크립트에 리눅스

uid="userid" 
pwd="password" 
echo "enter name:" 
read name 

dbname=`sqlplus -s <<EOF 
$uid/$pwd @part1.sql $name 
EOF` 

if [$dbname == $name ] 
then 
    echo name found 
    exit 
fi 

에서이 같은

뭔가 예 :

set heading off 
set pagesize 0 
set tab off 

SELECT cname 
FROM customer 
    WHERE cname = '&1' and rownum <2; 
/
exit 
# add other reads & execure part2,3, etc 
2

whenever SQL * Plus 명령을 사용하면 SQL 또는 PL/SQL에서 오류가 발생할 때 SQL * Plus를 종료 할 수 있습니다. 즉, 스크립트를 종료하도록 사용자 정의 예외를 발생시키는 것입니다.

WHENEVER SQLERROR EXIT; 
ACCEPT p_cname PROMPT 'Enter Customer Name: ' 
DECLARE 
    v_cname CHAR(20); 
BEGIN 
    SELECT cname INTO v_cname 
      FROM customer 
    WHERE cname = '&p_cname'; 

    IF v_name = '&p_cname' THEN 
     raise_application_error(-2000,'Your error Message here'); 
    END IF; 
END; 
/
6

오류 검사를 활성화 한 다음 오류를 발생시킴으로써 수행 할 수 있습니다. WHENEVER 명령에서

ACCEPT p_cname PROMPT 'Enter Customer Name: ' 

WHENEVER SQLERROR EXIT SUCCESS ROLLBACK; 

DECLARE 
    v_count INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO v_count 
      FROM customer 
    WHERE cname = '&p_cname'; 

    IF v_count > 0 THEN 
      raise_application_error(-20100, 'Customer already exists'); 
    END IF; 

END; 
/

-- Issue a new WHENEVER statement here if you want different error-handling for 
-- the rest of the script 

-- Other ACCEPT statements if a match was not found. 

SUCCESS 키워드는 SQLPLUS가 호출 된 쉘이 다시 성공 코드를 반환된다는 것을 의미합니다. FAILURE을 사용하여 일반적인 실패 코드 또는 특정 값을 반환하는 다른 옵션을 반환 할 수도 있습니다.

+1

동의합니다. 난 그냥 No_data_found 또는 too_many_rows 예외를 피하기 위해 count (*)를 사용했다. – zep

+0

@zep - 좋은 지적! 이 쿼리는 no_data_found를 발생시키기 때문에 고객이 없으면 스크립트가 종료됩니다. 내가 고칠거야. –

+0

아주 매끄러운 솔루션! –