Skip to end of metadata
Go to start of metadata

Overview

ALTIBASE HDB supports use of the following control flow statements in the stored procedures

  • The IF and CASE conditional statements
  • The LOOP, WHILE and FOR loop constructs, which cause multiple statements to be repeatedly
    executed
  • The EXIT and CONTINUE statements, which are used to control the iteration of loops
  • The NULL statement, which indicates that nothing is to be executed
  • The GOTO statement, which is used to transfer control to a particular point

 The functionalities of control flow statement in the ORACLE PL/SQL have so much similarity to that of the ALTIBASE Stored Procedures as shown below.

Example

ORACLE

ALTIBASE HDB

Comments

CREATE OR REPLACE PROCEDURE PROC1
AS
sales NUMBER(8,2) := 10100;
quota NUMBER(8,2) := 10000;
bonus NUMBER(6,2);
emp_id NUMBER(6) := 120;
BEGIN
IF sales > (quota + 200) THEN
bonus := (sales - quota)/4;
UPDATE employees SET salary = salary + bonus WHERE eno = emp_id;
END IF;
END;
/

CREATE OR REPLACE PROCEDURE PROC1
AS
sales NUMBER(8,2) := 10100;
quota NUMBER(8,2) := 10000;
bonus NUMBER(6,2);
emp_id NUMBER(6) := 120;
BEGIN
IF sales > (quota + 200) THEN
bonus := (sales - quota)/4;
UPDATE employees SET salary = salary + bonus WHERE eno = emp_id;
END IF;
END;
/

IF-THEN Statement

CREATE OR REPLACE PROCEDURE PROC1
AS
grade CHAR(1);
BEGIN
grade := 'B';
CASE grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
END CASE;
END;
/

CREATE OR REPLACE PROCEDURE PROC1
AS
grade CHAR(1);
BEGIN
grade := 'B';
CASE grade
WHEN 'A' THEN SYSTEM_.PRINTLN('Excellent');
WHEN 'B' THEN SYSTEM_.PRINTLN('Very Good');
WHEN 'C' THEN SYSTEM_.PRINTLN('Good');
WHEN 'D' THEN SYSTEM_.PRINTLN('Fair');
WHEN 'F' THEN SYSTEM_.PRINTLN('Poor');
ELSE SYSTEM_.PRINTLN('No such grade');
END CASE;
END;
/

CASE-WHEN Statement

CREATE OR REPLACE PROCEDURE PROC1
AS 
credit_rating NUMBER := 0;
BEGIN
LOOP
credit_rating := credit_rating + 1;
IF credit_rating > 3 THEN
EXIT; -- exit loop immediately
END IF;
END LOOP;
-- control resumes here
DBMS_OUTPUT.PUT_LINE ('Credit rating: ' || TO_CHAR(credit_rating));
IF credit_rating > 3 THEN
RETURN; -- use RETURN not EXIT when outside a LOOP
END IF;
DBMS_OUTPUT.PUT_LINE ('Credit rating: ' || TO_CHAR(credit_rating));
END;
/

CREATE OR REPLACE PROCEDURE PROC1
AS
credit_rating NUMBER := 0;
BEGIN
LOOP
credit_rating := credit_rating + 1;
IF credit_rating > 3 THEN
EXIT; -- exit loop immediately
END IF;
END LOOP;
-- control resumes here
SYSTEM_.PRINTLN ('Credit rating: ' || TO_CHAR(credit_rating));
IF credit_rating > 3 THEN
RETURN; -- use RETURN not EXIT when outside a LOOP
END IF;
SYSTEM_.PRINTLN ('Credit rating: ' || TO_CHAR(credit_rating));
END;
/

EXIT Statement

CREATE OR REPLACE PROCEDURE PROC1
ASs PLS_INTEGER := 0;
i PLS_INTEGER := 0;
j PLS_INTEGER;
BEGIN
<<outer_loop>>
LOOP
i := i + 1;
j := 0;
<<inner_loop>>
LOOP
j := j + 1;
s := s + i * j; -- sum a bunch of products
EXIT inner_loop WHEN (j > 5);
EXIT outer_loop WHEN ((i * j) > 15);
END LOOP inner_loop;
END LOOP outer_loop;
DBMS_OUTPUT.PUT_LINE('The sum of products equals: ' || TO_CHAR(s));
END;
/

CREATE OR REPLACE PROCEDURE PROC1
AS
s INTEGER := 0;
i INTEGER := 0;
j INTEGER;
BEGIN
<<outer_loop>>
LOOP
i := i + 1;
j := 0;
<<inner_loop>>
LOOP
j := j + 1;
s := s + i * j; -- sum a bunch of products
EXIT inner_loop WHEN (j > 5);
EXIT outer_loop WHEN ((i * j) > 15);
END LOOP inner_loop;
END LOOP outer_loop;
SYSTEM_.PRINTLN('The sum of products equals: ' || TO_CHAR(s));
END;
/

EXIT With Labeled Loops

CREATE OR REPLACE PROCEDURE PROC1
AS 
p NUMBER := 0;
BEGIN
FOR k IN 1..500 LOOP -- calculate pi with 500 terms
p := p + ( ( (-1) ** (k + 1) ) / ((2 * k) - 1) );
END LOOP;
p := 4 * p;
DBMS_OUTPUT.PUT_LINE( 'pi is approximately : ' || p ); -- print result
END;
/

CREATE OR REPLACE PROCEDURE PROC1
AS
p NUMBER := 0;
BEGIN
FOR k IN 1 .. 500 LOOP -- calculate pi with 500 terms
p := p + ( ( (-1) * (k + 1) ) / ((2 * k) - 1) );
END LOOP;
p := 4 * p;
SYSTEM_.PRINTLN( 'pi is approximately : ' || p ); -- print result
END;
/

Simple FOR..LOOP Statement

CREATE OR REPLACE PROCEDURE PROC1
AS
v_employees employees%ROWTYPE; -- declare record variable
CURSOR c1 is SELECT * FROM employees;
BEGIN
OPEN c1; -- open the cursor before fetching
-- An entire row is fetched into the v_employees record
FOR i IN 1..10 LOOP
FETCH c1 INTO v_employees;
EXIT WHEN c1%NOTFOUND;
-- process data here
END LOOP;
CLOSE c1;
END;
/

CREATE OR REPLACE PROCEDURE PROC1
AS
v_employees employees%ROWTYPE; -- declare record variable
CURSOR c1 is SELECT * FROM employees;
BEGIN
OPEN c1; -- open the cursor before fetching
-- An entire row is fetched into the v_employees record
FOR i IN 1 .. 10 LOOP
FETCH c1 INTO v_employees;
EXIT WHEN c1%NOTFOUND;
-- process data here
END LOOP;
CLOSE c1;
END;
/

EXIT in a LOOP

CREATE OR REPLACE PROCEDURE PROC1
AS
v_last_name VARCHAR2(25);
v_emp_id NUMBER(6) := 120;
BEGIN
<<get_name>>
SELECT e_lastname INTO v_last_name FROM employees
WHERE eno = v_emp_id;
BEGIN
DBMS_OUTPUT.PUT_LINE (v_last_name);
v_emp_id := v_emp_id + 5;
IF v_emp_id < 120 THEN
GOTO get_name; -- branch to enclosing block
END IF;
END;
END;
/

CREATE OR REPLACE PROCEDURE PROC1
AS
v_last_name VARCHAR2(25);
v_emp_id NUMBER(6) := 120;
BEGIN
<<get_name>>
SELECT e_lastname INTO v_last_name FROM employees
WHERE eno = v_emp_id;
BEGIN
SYSTEM_.PRINTLN (v_last_name);
v_emp_id := v_emp_id + 5;
IF v_emp_id < 120 THEN
GOTO get_name; -- branch to enclosing block
END IF;
END;
END;
/

GOTO Statement to Branch an Enclosing Block

CREATE OR REPLACE PROCEDURE proc1
AS
v_job_id VARCHAR2(10);
v_emp_id NUMBER(6) := 110;
BEGIN
SELECT emp_job INTO v_job_id FROM employees
WHERE emp_job = v_emp_id;
IF v_job_id = 'SA_REP' THEN
UPDATE employees SET salary = salary * 1.2;
ELSE
NULL; -- do nothing if not a sales representative
END IF;
END;
/

CREATE OR REPLACE PROCEDURE proc1
AS
v_job_id VARCHAR2(10);
v_emp_id NUMBER(6) := 110;
BEGIN
SELECT emp_job INTO v_job_id FROM employees
WHERE emp_job = v_emp_id;
IF v_job_id = 'SA_REP' THEN
UPDATE employees SET salary = salary * 1.2;
ELSE
NULL; -- do nothing if not a sales representative
END IF;
END;
/

NULL Statement

  • No labels