我正在将数据推送到我在PL / SQL中创建的表中,我有两个问题。 我创建了一个过于简单的示例来说明使用位于以下链接中的emp表: https://apexplained.wordpress.com/2013/04/20/the-emp-and-dept-tables-in-oracle/
我在fetch语句中创建了两个查询(一个返回6行,另一个返回2行)。
开始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
答案 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.