Как это работает PL / SQL? - PullRequest
0 голосов
/ 01 мая 2018

Пожалуйста, объясните, как это работает, Thx.

DECLARE   
CURSOR ab IS
SELECT emp.ename, emp.sal, dept.loc
FROM emp
JOIN dept ON emp.deptno = dept.deptno;
TYPE tbl_join IS TABLE OF cc%ROWTYPE;
l_table tbl_join;
BEGIN
OPEN cc;
FETCH cc BULK COLLECT INTO l_table;
CLOSE cc;
FOR indx IN
1 .. l_table.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE(l_table(indx).ename);
DBMS_OUTPUT.PUT_LINE(l_table(indx).sal);
DBMS_OUTPUT.PUT_LINE(l_table(indx).loc);
END LOOP;
END;

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Все довольно просто. Пожалуйста, смотрите объяснение ниже:

Зелье декларации:

  • 'ab' объявляется как курсор, который извлекает данные ename, sal & loc при его вызове. Это основано на запросе, упомянутом как запрос соединения.

  • 'tbl_join' - это пользовательский тип данных, который объявлен как таблица.

  • 'l_table' - это переменная, объявленная как пользовательский тип данных tbl_join, созданный ранее.

Часть исполнения

  • Open cc означает открытый курсор

  • Fetch cc извлекает данные на основе запроса курсора и вставляет их в l_table

  • close cc закрывает курсор.

  • Для каждого цикла используется перебор записей l_table. Count используется для получения общей строки этой l_table. Итак, цикл будет повторять l_table.count раз.

  • Dbms_output.put_line - печатать значения переданного в нем параметра. Здесь передается номер записи таблицы с указанием значения столбца.

  • Loop ..... End Loop - это синтаксис цикла.

0 голосов
/ 02 мая 2018

Я думаю, что ваш курсор должен называться 'cc' вместо 'ab'.

DECLARE
    CURSOR ab -- This is a corsor. A prepared statement which you can call during executing
    IS
        SELECT emp.ename, emp.sal, dept.loc
          FROM emp JOIN dept ON emp.deptno = dept.deptno;

    TYPE tbl_join IS TABLE OF cc%ROWTYPE; -- this is a table-type. Like an array of antoher type. In this example it is an array of the result of cc. 

    l_table   tbl_join; -- this is a variable of the table-type, which you can fill with data
BEGIN
    OPEN cc; -- here you open the cursor cc. I guess your cursor 'ab' (1st row) should be named 'cc' and opened here.

    FETCH cc BULK COLLECT INTO l_table; -- you read all you data from the cursor and stick it into you variable 'l_table'.

    CLOSE cc; -- you're done with you cursor, because of this you close it.

    FOR indx IN 1 .. l_table.COUNT -- a for-loop to loop through you table-variable.
    LOOP
        -- you access the elements of your table with the loop-variable 'indx'.
        DBMS_OUTPUT.PUT_LINE (l_table (indx).ename); -- you access the fiels of your element.
        DBMS_OUTPUT.PUT_LINE (l_table (indx).sal);
        DBMS_OUTPUT.PUT_LINE (l_table (indx).loc);
    END LOOP;
END;
0 голосов
/ 01 мая 2018
  • Получите имя сотрудника, зарплату и сведения о местонахождении в КУРСОР ab.

  • Для каждой строки в курсоре выведите детали в цикле.

  • Цикл завершается, когда он достигает общего числа строк.

Курсоры см. здесь

Курсор PL / SQL используется для извлечения и обработки ноля или более строк данные. Есть несколько шагов, чтобы использовать курсор и в зависимости от как вы реализуете курсор, вы можете контролировать каждый шаг или иметь База данных выполняет их. Курсор PL / SQL основан на SELECT оператор, обычно объявляемый в разделе объявлений PL / SQL блок. Оператор не ограничен в отношении извлеченных столбцов или количество соединенных столов.

Этот фрагмент использует массовый сбор, см. здесь .

Одним из способов получения данных является массовый сбор данных Oracle. С Oracle массовый сбор, движок PL / SQL сообщает механизму SQL, что нужно собрать много строки сразу и поместите их в коллекцию. Во время массовых Oracle собирать, механизм SQL извлекает все строки и загружает их в сбор и переключается обратно на движок PL / SQL. Когда строки извлекается с помощью Oracle массового сбора, они извлекаются только с двумя переключение контекста Чем больше количество строк вы хотите собирать с Oracle массовый сбор, тем больше повышение производительности вы увидим, используя Oracle массового сбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...