Skip to content

Instantly share code, notes, and snippets.

@AARomanov1985
Last active August 29, 2015 14:01
Show Gist options
  • Save AARomanov1985/138ebe21535f7c131976 to your computer and use it in GitHub Desktop.
Save AARomanov1985/138ebe21535f7c131976 to your computer and use it in GitHub Desktop.
PL-SQL курсоры, индексные таблицы, массивы
CREATE OR REPLACE TYPE NameList AS
VARRAY(20) OF VARCHAR2(30);
/
DECLARE
TYPE Table_1 IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
--Привязка:
v_Var Table_1;
BEGIN
DBMS_OUTPUT.ENABLE(20000);
FOR v_tmp in 1..10 LOOP
v_Var(v_tmp):=v_tmp*17;
DBMS_OUTPUT.PUT_LINE('v_Var('|| v_tmp || ') ' || v_Var(v_tmp));
END LOOP;
END;
--Переменные с типами, указанными выше
v_var Table_1;
v_id sch_name;
v_idname sch_name;
--Создание таблиц с помощью конструкторов на основе объявленных выше типов:
--Создадим таблицу на основе Table_1 с одним элементом:
v_tab1 Table_1:=Table_1(-12);
--Создадим таблицу на основе sch_name с пятью элементами:
v_tab2 Table_1:=Table_1(1,2,3,4,5);
--Таблица без элементов:
v_tab3 table_1:=Table_1();
BEGIN
--Значения в таблицах можно изменять:
v_tab1(1):=0;
v_tab2(1):=-2;
v_tab2(2):=0;
END;
/**************************************
Пустые таблицы
**************************************/
DECLARE
TYPE tmp_tab IS TABLE OF number;
--Создадим NULL-таблицу:
v_tab1 tmp_tab;
--Создадим таблицу с одним NULL-элементом:
v_tab2 tmp_tab:=tmp_tab();
BEGIN
DBMS_OUTPUT.ENABLE(20000);
IF v_tab1 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('v_tab1 is null');
ELSE
DBMS_OUTPUT.PUT_LINE('v_tab1 is not null');
END IF;
IF v_tab2 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('v_tab2 is null');
ELSE
DBMS_OUTPUT.PUT_LINE('v_tab2 is not null');
END IF;
END;
/* Вывод:
------------------------
v_tab1 is null
v_tab2 is not null
*/
DECLARE
--Список id, с опцией NOT NULL
TYPE idList IS VARRAY(10) OF NUMBER(3) NOT NULL;
--Список названий
TYPE NameList IS VARRAY(10) OF enforce_dba.schet_fr.idname%TYPE;
--Объявление массива:
v_idList idList:=idList(1,2,3,4,5);
v_NameList NameList:=NameList('Т-1 6кВ','Т-2 6кВ','Т1 35кВ','Т2 35кВ','ТСН 0.4кВ');
BEGIN
DBMS_OUTPUT.ENABLE(20000);
--Расширим массивы, внеся новые элементы:
v_idList.EXTEND;
v_NameList.EXTEND;
v_idList(6):=6;
v_NameList(6):='ККУ-6кВ';
/* Расширять массив свыше указанного при инициализации массива нельзя!
В самом начале был указан размер 10 значений (IS VARRAY(10))*/
END;
DECLARE
CURSOR tmp_1 IS
SELECT id, idname
FROM enforce_dba.schet_fr
WHERE idname LIKE '%Водоканал%';
-- Запись для хранения считанной информации:
v_tmp_Data tmp_1%ROWTYPE;
BEGIN
DBMS_output.ENABLE(20000);
OPEN tmp_1;
FETCH tmp_1 INTO v_tmp_Data;
WHILE tmp_1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_tmp_Data.id || ' ' || v_tmp_Data.idname);
FETCH tmp_1 INTO v_tmp_Data;
END LOOP;
CLOSE tmp_1;
END;
/***************************************************
*****************************************************/
DECLARE
v_Big number;
CURSOR tmp_2 IS
SELECT id, iddate, znak
FROM enforce_dba.f_sch_ee
WHERE id=122 AND iddate between '1.04.2014' and '1.05.2014';
v_Data tmp_2%ROWTYPE;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN tmp_2;
FETCH tmp_2 INTO v_Data;
WHILE tmp_2%FOUND LOOP
v_Big:=v_Data.znak*50;
DBMS_OUTPUT.PUT_LINE(v_Data.id || ' ' || v_Data.iddate || ' ' || v_Data.znak || ' ' || v_Big);
FETCH tmp_2 INTO v_Data;
END LOOP;
CLOSE tmp_2;
END;
BEGIN
FOR v_Data IN (SELECT id, idname
FROM enforce_dba.schet_fr) LOOP
DBMS_OUTPUT.PUT_LINE(v_Data.id || ' ' || v_Data.idname);
END LOOP;
END;
create or replace procedure enf_idname_out
(c_id IN NUMBER) AS
--Тип курсорной переменной:
TYPE t_enf IS REF CURSOR;
--Тип переменной:
v_enf t_enf;
--Переменные для хранения результатов:
v_id enforce_dba.schet_fr.id%TYPE;
v_idname enforce_dba.schet_fr.idname%TYPE;
BEGIN
DBMS_OUTPUT.ENABLE(NULL);
OPEN v_enf FOR
SELECT id, idname
FROM enforce_dba.schet_fr
WHERE id=c_id;
LOOP
FETCH v_enf INTO
v_id, v_idname;
EXIT WHEN v_enf%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_id || ' ' || v_idname);
END LOOP;
CLOSE v_enf;
END;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment