DECLARE
-- оператор для создания таблицы
vCreateTable VARCHAR2(200) := 'CREATE TABLE demo_tbl (ID NUMBER(3), NAME VARCHAR2(50))';
-- оператор для удаления таблицы
vDropTable VARCHAR2(200) := 'DROP TABLE demo_tbl';
-- оператор для вставки в таблицу
vInsertTable VARCHAR2(200) := 'INSERT INTO demo_tbl(ID, NAME) VALUES(:id, :name)';
-- оператор для удаления строки из таблицы
vDeleteTable VARCHAR2(200) := 'DELETE FROM demo_tbl WHERE ID=:id';
-- оператор для считывания строк из таблицы
vSelectTable VARCHAR2(200) := 'SELECT ID, NAME FROM demo_tbl WHERE ID BETWEEN :id_l AND :id_h';
vResult INTEGER;
-- выходные переменные для оператора SELECT
vId NUMBER(3);
vName VARCHAR2(50);
-- объявляем курсорную переменную
TYPE ref_cur IS REF CURSOR;
c ref_cur;
BEGIN
-- создадим таблицу
EXECUTE IMMEDIATE vCreateTable;
-- вставим данные в таблицу
FOR vId IN 1..5 LOOP
EXECUTE IMMEDIATE vInsertTable USING vId, 'Name ╪'||vId ;
END LOOP;
-- зафиксируем изменения
COMMIT;
-- удалим строку с ID=3 из таблицы
EXECUTE IMMEDIATE vDeleteTable USING 3;
-- зафиксируем изменения
COMMIT;
-- считаем строки с ID=2,3,5
-- здесь используются фактические значения,
-- но можно передавать и переменные, например USING v1, v2
OPEN c FOR vSelectTable USING 2, 5;
LOOP
FETCH c INTO vId, vName;
EXIT WHEN c%NOTFOUND;
-- распечатаем полученные данные
DBMS_OUTPUT.PUT_LINE(vId||' '||vName);
END LOOP;
CLOSE c;
-- если запрос возврашает не более одной строки можно записать так
-- возврашается строка с ID=4, так как сторока с ID=3 удалена
EXECUTE IMMEDIATE vSelectTable INTO vId, vName USING 3, 4;
-- распечатаем полученные данные
DBMS_OUTPUT.PUT_LINE('-------------------');
DBMS_OUTPUT.PUT_LINE(vId||' '||vName);
-- удалим таблицу
EXECUTE IMMEDIATE vDropTable;
END;