这是如何工作的pl / sql?

时间:2018-05-01 16:07:39

标签: sql oracle plsql

请解释这是如何工作的,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 :(得分:0)

  • 将员工姓名,工资和位置详细信息提取到CURSOR ab。

  • 对于光标中的每一行,都会在循环中打印详细信息。

  • 当循环达到总行数时,循环终止。

对于游标,请参阅here

  

PL / SQL游标用于检索和处理零行或多行   数据。使用游标有很多步骤,具体取决于   如何实现光标,你可以控制每一步或拥有   数据库执行它们。 PL / SQL游标基于SELECT   语句,通常在PL / SQL的声明部分声明   块。该语句不受限于检索的列或   加入的桌子数量。

此代码段正在使用批量收集,请参阅here

  

获取数据的一种方法是Oracle批量收集。用Oracle   批量收集,PL / SQL引擎告诉SQL引擎收集很多   一次排,并将它们放在一个集合中。在Oracle批量处理期间   收集,SQL引擎检索所有行并将它们加载到   收集并切换回PL / SQL引擎。当行是   使用Oracle批量收集检索它们,只用两个检索它们   上下文切换。您想要的行数越多   收集Oracle批量收集,您的性能提升越多   将看到使用Oracle批量收集。

答案 1 :(得分:0)

这很简单。请参阅以下说明:

宣言药水:

  • 'ab'被声明为光标,用于检索ename,sal&在调用时定位数据。它基于提到的连接查询查询。

  • 'tbl_join'是一个自定义数据类型,声明为table。

  • 'l_table'是声明为先前创建的tbl_join自定义数据类型的变量。

执行部分

  • 打开cc表示打开游标

  • Fetch cc根据游标查询检索数据并将其插入l_table

  • 关闭cc正在关闭游标。

  • 每个循环用于迭代l_table的记录。 Count用于检索该l_table的总行数。因此,循环将迭代l_table.count次。

  • Dbms_output.put_line用于打印在其中传递的参数的值。这里传递表记录号与要打印的列值。

  • 循环......结束循环是循环的语法。

答案 2 :(得分:0)

我认为你的光标应该被命名为'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;