【发布时间】:2016-12-21 16:15:53
【问题描述】:
我正在将数据推送到我在 PL/SQL 中创建的表中,我有两个问题。 我创建了一个过于简单的示例来说明使用位于以下链接中的 emp 表: https://apexplained.wordpress.com/2013/04/20/the-emp-and-dept-tables-in-oracle/
我在 fetch 语句中创建了两个查询(一个返回 6 行,一个返回 2 行)。
- 如何查看表格结果?
- 如何编写我的 PL/SQL 代码,以便将新数据推送到表末尾并且不会删除表中的所有内容。
开始 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
【问题讨论】:
-
EMP_TAB是一个集合,它将具有行成员,每个行成员将具有列(属性),例如EMPNO或EMPName等。要访问各个行,您必须使用EMP_TAB(indx)要访问第一条记录的empno,您必须使用EMP_TAB(indx).EMPNO。更多示例请参考oracle-base.com/articles/9i/bulk-binds-and-record-processing-9i