PLS-00221报错:匿名块用INDEX BY表时提示JOBSTAB不是过程或未定义
问题根因
你遇到的PLS-00221报错由循环内的jobstab(rec.job_id);语句触发:PL/SQL语法中,单独书写集合变量(索引值)的格式会被Oracle识别为存储过程调用,自然会抛出「JOBSTAB不是存储过程或未定义」的错误。
修正方案
根据你的实际需求选择对应写法:
场景1:需要将jobs表数据存入索引表
需要修改两处逻辑:
- 循环的查询语句改为取出jobs表全字段,而不是仅取job_id
- 补充赋值语法,将查询到的行记录赋值给集合对应索引的元素
修正后代码如下:
DECLARE TYPE jobs_tab_type IS TABLE OF jobs%rowtype INDEX BY jobs.job_id%type; jobstab jobs_tab_type; BEGIN FOR rec IN (SELECT * FROM jobs) LOOP -- 给集合对应索引的元素赋值 jobstab(rec.job_id) := rec; END LOOP; -- 测试取值:输出job_id为AD_PRES的职位名称,可按需启用 -- dbms_output.put_line(jobstab('AD_PRES').job_title); END; /
场景2:仅需要判断对应job_id的元素是否已存在
调用集合内置的EXISTS方法即可,返回布尔值:
IF jobstab.EXISTS(rec.job_id) THEN -- 对应逻辑 END IF;
内容的提问来源于stack exchange,提问作者Elijah Leis
相关产品推荐
相关产品推荐

