oracle - plsql这个代码错误有什么问题'INTO列表类型错误'
问题描述
有人可以帮帮我吗?为什么我会收到此错误“INTO 列表类型错误”?
DECLARE
TYPE v_dept_table IS TABLE OF DEPARTMENTS.DEPARTMENT_NAME%TYPE INDEX BY PLS_INTEGER;
v_record_dept_table v_dept_table;
v_loop_count NUMBER := 10;
v_dept_no NUMBER := 1;
BEGIN
FOR v_dept_no IN 1..v_loop_count LOOP
SELECT DEPARTMENTS.DEPARTMENT_NAME
INTO v_record_dept_table
FROM DEPARTMENTS
WHERE DEPARTMENT_ID = v_dept_no;
v_dept_no := v_dept_no + 1;
INSERT
INTO v_dept_table
VALUES v_record_dept_table;
END LOOP;
FOR indx IN NVL (v_dept_table.FIRST, 0) .. NVL (v_dept_table.LAST, -1)
LOOP
DBMS_OUTPUT.PUT_LINE(v_dept_table(indx));
END LOOP;
END;
ORA-06550: line 16, column 14: PLS-00597: expression 'V_RECORD_DEPT_TABLE' in the INTO list is of wrong type
为什么是错误的类型?我正在使用 Oracle 的 hr 模式
解决方案
不完全一样;你做错了几件事。我试图修复你的代码(尽可能少的修改);看看,阅读我写的评论,将其与您的代码进行比较。旁注:我使用 Scott 的DEPT
桌子,因为我没有你的DEPARTMENTS
.
SQL> set serveroutput on
SQL> DECLARE
2 TYPE v_dept_table IS TABLE OF dept.dname%TYPE
3 INDEX BY PLS_INTEGER;
4
5 v_record_dept_table v_dept_table;
6
7 v_loop_count NUMBER := 10;
8 v_dept_no NUMBER := 1;
9 BEGIN
10 FOR v_dept_no IN 1 .. v_loop_count
11 LOOP
12 BEGIN
13 SELECT dname
14 INTO v_record_dept_table (v_dept_no) --> you're missing "(v_dept_no)"
15 FROM dept
16 WHERE deptno = v_dept_no;
17 -- Don't manually increment FOR loop variable; Oracle does it itself
18 -- v_dept_no := v_dept_no + 1;
19
20 -- You can't insert into "type"; besides, you've already inserted into V_RECORD_DEPT_TABLE.
21 -- INSERT INTO v_dept_table VALUES v_record_dept_table;
22 EXCEPTION
23 WHEN NO_DATA_FOUND
24 THEN
25 NULL;
26 END;
27 END LOOP;
28
29 -- loop through V_RECORD_DEPT_TABLE (collection), not V_DEPT_TABLE (type). No need for NVL.
30 FOR indx IN NVL (v_record_dept_table.FIRST, 0) ..
31 NVL (v_record_dept_table.LAST, -1)
32 LOOP
33 DBMS_OUTPUT.PUT_LINE (v_record_dept_table (indx));
34 END LOOP;
35 END;
36 /
ACCOUNTING
PL/SQL procedure successfully completed.
SQL>
或者,看看这是否有帮助。我使用了内置类型 ( sys.odcivarchar2list
) 和BULK COLLECT INTO
( 表现更好)。
SQL> DECLARE
2 v_record_dept_table SYS.odcivarchar2list;
3 BEGIN
4 SELECT dname
5 BULK COLLECT INTO v_record_dept_table
6 FROM dept;
7
8 FOR indx IN v_record_dept_table.FIRST .. v_record_dept_table.LAST
9 LOOP
10 DBMS_OUTPUT.PUT_LINE (v_record_dept_table (indx));
11 END LOOP;
12 END;
13 /
ACCOUNTING
RESEARCH
SALES
OPERATIONS
PL/SQL procedure successfully completed.
SQL>
推荐阅读
- bash - Splitting a String in unix
- amazon-ec2 - AWSLambdaBasicExecutionRole not able to describe instances
- sql-server - 如何将日期时间列格式从 yyyy-dd-MM HH:mm:ss 转换为 yyyy-MM-dd HH:mm:ss
- gitlab - Gitlab with Let's Encrypt certificate: upgrade your ACME client to ACMEv2
- kotlin - Removing arbitrary contents ahead of an Iterator or List in Kotlin
- docker - Docker 错误“无法连接到网络
: 超出上下文期限。” - linux - 如何允许非 root 用户使用由 root 安装的 Perl 模块?
- angular - 如何使用会话存储以角度区分窗口关闭和窗口刷新
- javascript - 功能无线电组件未按预期显示
- android - gradle 更新后,Google 服务插件为客户端搜索错误的 google-services.json 文件