Oracle SQL * Plus ПРИНЯТЬ заявления - PullRequest
1 голос
/ 29 июля 2011

Мне нужно немного помочь с моим сценарием SQL * Plus.Могу ли я получить его так, чтобы он принимал переменную, проверял таблицу на совпадение и, если он ее обнаружил , завершал программу и не продолжал с остальными операторами принятия?

Пока у меня есть этот код:

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.

Я не хочу, чтобы он продолжался с остальной частью программы, если совпадение найдено.Есть ли способ сделать это?

Ответы [ 5 ]

6 голосов
/ 29 июля 2011

Вы можете сделать это, включив проверку ошибок, затем вызвав ошибку.

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.

В команде WHENEVER ключевое слово SUCCESS означает, что SQLPlus вернет код успеха обратно в оболочкуиз которого он был вызван.Вы также можете использовать FAILURE для возврата универсального кода ошибки или другие параметры для возврата определенных значений.

2 голосов
/ 29 июля 2011

Используя команду whenever SQL * Plus, вы можете заставить SQL * Plus завершать работу при возникновении ошибки в SQL или PL / SQL.Это означает, что все, что вам нужно сделать, это вызвать пользовательское исключение, чтобы заставить скрипт завершиться.

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;
/
1 голос
/ 29 июля 2011

Быстрый ответ «Не совсем». SQL * Plus - довольно простой клиент. Он может выдать запрос или блок PL / SQL на сервер и показать возвращаемый набор данных, но SQL * Plus (не SQL или PL / SQL) не имеет простых условных операторов, таких как IF или итеративные структуры LOOP.

Вместо того, чтобы использовать SQL * Plus, вы должны рассмотреть язык сценариев, такой как Perl или Python.

0 голосов
/ 29 июля 2011

Гари прав, вам нужно написать сценарий решения.

что-то вроде этого в linux

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

в вашем скрипте вы можете использовать & 1, чтобы получить входной параметр (я хотел бытакже ограничьте результаты 1) например:

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
0 голосов
/ 29 июля 2011

Почему бы просто не переключить условие?

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

Таким образом, ничего не произойдет, если v_name совпадает с вводом, потому что нет ELSE части

...