在PL / SQL

时间:2016-12-21 06:40:37

标签: oracle plsql

我正在将数据推送到我在PL / SQL中创建的表中,我有两个问题。 我创建了一个过于简单的示例来说明使用位于以下链接中的emp表: https://apexplained.wordpress.com/2013/04/20/the-emp-and-dept-tables-in-oracle/

我在fetch语句中创建了两个查询(一个返回6行,另一个返回2行)。

  1. 如何查看表格的结果?
  2. 如何编写PL / SQL代码,以便将新数据推送到表的末尾,并且不会删除Table中的所有内容。
  3. 开始PL / SQL代码

    DECLARE
       TYPE EmpTabTyp IS TABLE OF EMP%ROWTYPE
       INDEX BY PLS_INTEGER;
    
       CURSOR FetchCursor1 is
        select * from emp where empno > 7800;
    
      CURSOR FetchCursor2 is
        select * from emp where empno < 7500;
    
       emp_tab EmpTabTyp;
    BEGIN
       /* Retrieve employee record. */
       OPEN FetchCursor1;
       FETCH FetchCursor1
            bulk collect into Emp_Tab;
       DBMS_OUTPUT.PUT_LINE('Size of Emp_Tab is ' || EMP_TAB.COUNT);
       close FetchCursor1;
       for indx in 1 .. EMP_TAB.COUNT
       loop
        dbms_output.put_line(indx);
        --The row below is giving error.
        --dbms_output.put_line(EMP_TAB.EMPNO||chr(9)||chr(9)||EMP.ENAME);
       end loop;
    
       OPEN FetchCursor2;
       FETCH FetchCursor2
            bulk collect into Emp_Tab;
       DBMS_OUTPUT.PUT_LINE(EMP_TAB.COUNT);
       --DBMS_OUTPUT.PUT_LINE(||EMP_TAB.empno||);
       close FetchCursor2;
    
       DBMS_OUTPUT.PUT_LINE('Size of Emp_Tab is ' || EMP_TAB.COUNT);
    
       for indx in 1 .. EMP_TAB.COUNT
       loop
        dbms_output.put_line(indx);
        --dbms_output.put_line(EMP_TAB.EMPNO||chr(9)||chr(9)||EMP.ENAME);
       end loop;
    END;
    

    结束PL / SQL代码

    当我尝试运行以下声明时:

    DBMS_OUTPUT.PUT_LINE(||EMP_TAB.empno||);
    

    我收到此错误:

      

    错误报告:
      ORA-06550:第37行,第34栏:
      PLS-00302:组件'EMPNO'必须声明为
      ORA-06550:第37行,第5栏:
      PL / SQL:语句被忽略
      06550. 00000 - “行%s,列%s:\ n%s”
      *原因:通常是PL / SQL编译错误   *行动:

    以下是成功运行时的输出代码:

      

    匿名阻止完成
      Emp_Tab的大小为6
      1
      2
      3
      4
      5
      6
      2
      Emp_Tab的大小为2
      1
      2

4 个答案:

答案 0 :(得分:0)

EMP_TAB将是游标提取的行集合。要引用单个行,您必须EMP_TAB(n)表示结果集中的第n条记录。要选择第n条记录的empno,正确的语法为EMP_TAB(n).EMPNO

因此,在您的情况下正确使用

DBMS_OUTPUT.PUT_LINE(||EMP_TAB(indx).empno||); 

答案 1 :(得分:0)

试试这个:

 DECLARE
       TYPE EmpTabTyp IS TABLE OF EMP%ROWTYPE
       INDEX BY PLS_INTEGER;

       CURSOR FetchCursor1 is
        select * from emp where empno > 7800;

      CURSOR FetchCursor2 is
        select * from emp where empno < 7500;

       emp_tab EmpTabTyp;
    BEGIN
       /* Retrieve employee record. */
       OPEN FetchCursor1;
       FETCH FetchCursor1
            bulk collect into Emp_Tab;
       DBMS_OUTPUT.PUT_LINE('Size of Emp_Tab is ' || EMP_TAB.COUNT);
       close FetchCursor1;
       for indx in 1 .. EMP_TAB.COUNT
       loop
        dbms_output.put_line(indx);
        --The row below is giving error.
        dbms_output.put_line(EMP_TAB(indx).EMPNO||chr(9)||chr(9)||EMP_TAB(indx).ENAME);
       end loop;

       OPEN FetchCursor2;
       FETCH FetchCursor2
            bulk collect into Emp_Tab;
       close FetchCursor2;

       DBMS_OUTPUT.PUT_LINE('Size of Emp_Tab is ' || EMP_TAB.COUNT);

       for indx in 1 .. EMP_TAB.COUNT
       loop
        dbms_output.put_line(indx);
        dbms_output.put_line(EMP_TAB(indx).EMPNO||chr(9)||chr(9)||EMP_TAB(indx).ENAME);
       end loop;
    END;

答案 2 :(得分:0)

在这里你需要添加“DBMS_OUTPUT.PUT_LINE(|| EMP_TAB(indx).empno ||);”

答案 3 :(得分:0)

  

您好,上面的回答显示了如何使用打印线   DBMS_OUTPUT.PUT_LINE。如果我想向现有添加新行怎么样?   行的集合。请注意,第一个查询返回6行和第二行   查询返回2行。我想收集行(emp_tab)   第二次获取后有8行

您不能简单地将数据添加到集合中。 但是,您可以将BULK COLLECT添加到单独的集合中,然后组合这些集合。你真的需要一个嵌套表而不是一个关联数组。见下面的例子:

DECLARE
   TYPE EmpTabTyp IS TABLE OF EMPLOYEE%ROWTYPE ;
      --INDEX BY PLS_INTEGER;

   CURSOR FetchCursor1
   IS
      SELECT *
        FROM EMPLOYEE
       WHERE EMPLOYEE_id > 4;

   CURSOR FetchCursor2
   IS
      SELECT *
        FROM EMPLOYEE
       WHERE EMPLOYEE_id < 3;

   emp_tab   EmpTabTyp;
   emp_tab1   EmpTabTyp;
BEGIN
   /* Retrieve employee record. */
   OPEN FetchCursor1;

   FETCH FetchCursor1 BULK COLLECT INTO Emp_Tab;

   CLOSE FetchCursor1;


   OPEN FetchCursor2;

     FETCH FetchCursor2 BULK COLLECT INTO emp_tab1;

   CLOSE FetchCursor2;  
   --Joining two collections
   Emp_Tab := Emp_Tab MULTISET UNION  Emp_Tab1;

   FOR indx IN 1 .. EMP_TAB.COUNT
   LOOP      
      dbms_output.put_line(EMP_TAB(indx).EMPloyee_id||chr(9)||chr(9)||EMP_TAB(indx).First_NAME);
   END LOOP;
END;

输出:

sql > 
9               XING
1               Dan
2               Helen

PL/SQL procedure successfully completed.