2017-01-24 3 views
1

Я новичок в программировании pl/sql. У меня есть задание: «Brewbean's хочет добавить ограничение проверки в столбце QUANTITY таблицы BB_BASKETITEM. Если покупатель имеет значение количества больше 20 для элемента, Brewbean хочет отобразить на экране сообщение« Проверить количество ». Используя текстовый редактор, откройте файл assign04-06.txt в папке Chapter04. Для добавления ограничения проверки должен быть выполнен первый оператор ALTER TABLE. Следующий элемент - это блок PL/SQL, содержащий действие INSERT, которое проверяет это проверьте добавление кода в этот блок, чтобы уловить нарушение ограничения проверки и отобразить сообщение. " Я попытался, как this-undefined ошибка обработка исключений inpl/sql

set serveroutput on; 
declare 
ex_basket exception; 
pragma EXCEPTION_INIT(ex_basket, -02290); 
BEGIN 
ALTER TABLE bb_basketitem 
    ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20); 
    INSERT INTO bb_basketitem 
    VALUES (88,8,10.8,21,16,2,3); 
exception 
when ex_basket then 
DBMS_OUTPUT.PUT_LINE('Check Quantity'); 
END; 

Я получил сообщение об ошибке, как это:

ORA-06550: строка 5, колонка 1: PLS-00103: Обнаружен символ "ALTER", когда ожидая одного из следующее:

(начало случай объявить выход для Goto, если цикл по модулю нуль прагма рейз вернуть выберите обновление в то время как с

Извините за этот дешевый вопрос. Я хотел бы, чтобы кто-то помогал в этом.

ответ

1

Необходимо понимать, что SQL и PL/SQL - это два разных языка. ALTER TABLE - это оператор SQL, а не PL/SQL. Вы не можете запускать статические инструкции SQL DDL внутри блока PL/SQL. Однако PL/SQL легко интегрируется в SQL со многими функциями, которые он предоставляет. Одна из этих функций - EXECUTE IMMEDIATE.

Поэтому вам нужно DTO изменение Yoru ALTER заявления будет что-то вроде этого:

EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);' 
0

Чтобы быть очень с Удельным кодом. Код ниже будет достаточным для вашей проблемы.

SET serveroutput ON; 
DECLARE 
    ex_basket EXCEPTION; 
    pragma EXCEPTION_INIT(ex_basket, -02290); 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);'; 
    INSERT INTO testab VALUES 
    (88 
    ); 
EXCEPTION 
WHEN ex_basket THEN 
    dbms_output.put_line('Check Quantity'); 
END; 
0

Что касается обработки исключений, то это происходит во время выполнения. Однако, если у вас есть нераспознанное ключевое слово, например ALTER, то оно даже не будет скомпилировано, поэтому оно не будет работать вообще. Вместо этого весь блок отклоняется как недопустимый.

Кроме того, dbms_output, как правило, не является хорошим выбором для обработки исключений, поскольку все это делает его отправкой отладочного сообщения в выходной буфер и позволяет блоку успешно завершаться, так что любой скрипт, из которого это входит, не будет иметь никакой идеи что все пошло не так. Вы можете использовать raise or raise_application_error.

Смежные вопросы