【问题标题】:How is this working pl/sql?这是如何工作的pl/sql?
【发布时间】:2018-05-01 16:07:38
【问题描述】:

请解释一下这是如何工作的,谢谢。

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;

【问题讨论】:

  • 它不工作。它定义了一个名为ab 的游标,然后引用了一个不存在的名为cc 的游标。大概第 2 行应该是cursor cc is。顺便说一句,如果代码采用缩进和小写整齐排列,则通常更具可读性。

标签: sql oracle plsql


【解决方案1】:
  • 将员工姓名、薪水和位置详细信息提取到 CURSOR ab 中。

  • 为游标中的每一行循环打印详细信息。

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

游标请参考here

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

此 sn-p 正在使用批量收集,请参阅 here

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

【讨论】:

    【解决方案2】:

    这很简单。请看下面的解释:

    声明药水:

    • 'ab' 被声明为游标,当它被调用时检索 ename、sal 和 loc 数据。它基于作为连接查询提到的查询。

    • 'tbl_join' 是一种自定义数据类型,它被声明为表。

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

    执行部分

    • 打开cc表示打开光标

    • Fetch cc根据游标查询取回数据,插入到l_table中

    • close cc 正在关闭光标。

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

    • Dbms_output.put_line 用于打印传入的参数值。此处表记录号与要打印的列值一起传递。

    • Loop ..... End Loop 是循环的语法。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多