GOTO жумласини ишлатишда айрим чегаралар мавжуд. Хусусан IF жумласи ичига, LOOP жумласига, ёки қисмблок ичига бошқарувни узатиш мумкин эмас:
Мисол 1.
BEGIN
...
GOTO update_row; -- қоидага хилоф жумла
...
IF valid THEN
...
<>
UPDATE emp SET ...
END IF;
END;
Мисол 2.
BEGIN
...
IF valid THEN
...
GOTO update_row; -- қоидага хилоф жумла
ELSE
...
<>
UPDATE emp SET ...
END IF;
END;
Мисол 3.
BEGIN
...
IF status = 'OBSOLETE' THEN
GOTO delete_part; -- қоидага хилоф жумла
END IF;
...
BEGIN
...
<>
DELETE FROM parts WHERE ...
END;
END;
Мисол 4.
DECLARE
...
PROCEDURE compute_bonus (emp_id NUMBER) IS
BEGIN
...
GOTO update_row; -- қоидага хилоф жумла
END;
BEGIN
...
<>
UPDATE emp SET ...
END;
Мисол 5.
DECLARE
...
pe_ratio REAL;
BEGIN
...
SELECT price / NVL(earnings, 0) INTO pe_ratio FROM ...
<>
INSERT INTO stats VALUES (pe_ratio, ...);
EXCEPTION
WHEN ZERO_DIVIDE THEN
pe_ratio := 0;
GOTO insert_row; -- қоидага хилоф жумла
END;
NULL жумласи ошкор тарзда ҳаракат қилмасликни аниқлайди. У ҳеч қандай амал бажармайди ва бошқарувни навбатдаги жумлага узатади.
Мисол 1.
EXCEPTION
WHEN ZERO_DIVIDE THEN
ROLLBACK;
WHEN VALUE_ERROR THEN
INSERT INTO errors VALUES ...
COMMIT;
WHEN OTHERS THEN
NULL;
END;
Мисол 2.
IF rating > 90 THEN
compute_bonus(emp_id);
ELSE
NULL;
END IF;
Мисол 3.
PROCEDURE debit_account (acct_id INTEGER, amount REAL) IS
BEGIN
NULL;
END debit_account;
Do'stlaringiz bilan baham: |