请解释这是如何工作的,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;
答案 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;