在包中:ORA-00942 table 或视图不存在
In a package: ORA-00942 table or view does not exist
所以,我想我已经搜索了所有类似的帖子,但无法解决我的问题。
在 pkg 规范中,我声明:
TYPE record_type IS RECORD (Pat_Nbr VARCHAR2(4),
Trt_Procedure VARCHAR2(5),
Phys_ID VARCHAR2(3),
Phys_Name VARCHAR2(20),
Phys_Specialty VARCHAR2(18));
TYPE table_type IS TABLE OF record_type INDEX BY BINARY_INTEGER;
t_Pat_Trt table_type;
PROCEDURE BuildPatTbl
(t_PatTrt OUT table_type,
PatTblCount IN OUT NUMBER);
在正文中,我想做一个带有连接的简单 SELECT INTO。没有用,所以我尝试了所有这些(注意 3 次尝试 - 最后两次被注释掉),但我仍然收到 00942 错误。
PROCEDURE BuildPatTbl
(t_PatTrt OUT table_type,
PatTblCount IN OUT NUMBER)
IS
CURSOR cur_tbl IS SELECT a.Pat_Nbr, a.Trt_Procedure, Phys_ID, b.Phys_Name, b.Phys_Specialty
FROM Treatment a INNER JOIN Physician b
USING (Phys_ID);
temp_rec record_type;
BEGIN
OPEN cur_tbl;
LOOP
FETCH cur_tbl into temp_rec;
EXIT WHEN cur_tbl %NOTFOUND;
BEGIN
INSERT INTO t_PatTrt VALUES (temp_rec);
END;
END LOOP;
CLOSE cur_tbl;
/*EXECUTE IMMEDIATE 'CREATE TABLE t_PatTrt
(Pat_Nbr VARCHAR2(4),
Trt_Procedure VARCHAR2(5),
Phys_ID VARCHAR2(3),
Phys_Name VARCHAR2(20),
Phys_Specialty VARCHAR2(18)))';*/
/*FOR t_Pat_record IN cur_tbl LOOP
INSERT INTO t_PatTrt VALUES t_Pat_record;
END LOOP;*/
END BuildPatTbl;
有什么想法吗?
谢谢。
问题是您试图将集合视为数据库 table。那永远不会飞 - 它们是两个完全不同的东西。
为什么要 select 记录到数组中?您最终将如何处理这些结果?如果您要循环遍历并根据信息执行一些其他 DML,最好在单个 SQL 语句中完成整个操作。
如果您绝对必须将结果存储在一个集合中,请查看 bulk collect
首先,集合中不能直接插入,可以使用bulk collect into特性来实现
OPEN cur_tbl;
FETCH cur_tbl bulk collect into t_Pat_Trt;
CLOSE cur_tbl;
所以,我想我已经搜索了所有类似的帖子,但无法解决我的问题。
在 pkg 规范中,我声明:
TYPE record_type IS RECORD (Pat_Nbr VARCHAR2(4),
Trt_Procedure VARCHAR2(5),
Phys_ID VARCHAR2(3),
Phys_Name VARCHAR2(20),
Phys_Specialty VARCHAR2(18));
TYPE table_type IS TABLE OF record_type INDEX BY BINARY_INTEGER;
t_Pat_Trt table_type;
PROCEDURE BuildPatTbl
(t_PatTrt OUT table_type,
PatTblCount IN OUT NUMBER);
在正文中,我想做一个带有连接的简单 SELECT INTO。没有用,所以我尝试了所有这些(注意 3 次尝试 - 最后两次被注释掉),但我仍然收到 00942 错误。
PROCEDURE BuildPatTbl
(t_PatTrt OUT table_type,
PatTblCount IN OUT NUMBER)
IS
CURSOR cur_tbl IS SELECT a.Pat_Nbr, a.Trt_Procedure, Phys_ID, b.Phys_Name, b.Phys_Specialty
FROM Treatment a INNER JOIN Physician b
USING (Phys_ID);
temp_rec record_type;
BEGIN
OPEN cur_tbl;
LOOP
FETCH cur_tbl into temp_rec;
EXIT WHEN cur_tbl %NOTFOUND;
BEGIN
INSERT INTO t_PatTrt VALUES (temp_rec);
END;
END LOOP;
CLOSE cur_tbl;
/*EXECUTE IMMEDIATE 'CREATE TABLE t_PatTrt
(Pat_Nbr VARCHAR2(4),
Trt_Procedure VARCHAR2(5),
Phys_ID VARCHAR2(3),
Phys_Name VARCHAR2(20),
Phys_Specialty VARCHAR2(18)))';*/
/*FOR t_Pat_record IN cur_tbl LOOP
INSERT INTO t_PatTrt VALUES t_Pat_record;
END LOOP;*/
END BuildPatTbl;
有什么想法吗? 谢谢。
问题是您试图将集合视为数据库 table。那永远不会飞 - 它们是两个完全不同的东西。
为什么要 select 记录到数组中?您最终将如何处理这些结果?如果您要循环遍历并根据信息执行一些其他 DML,最好在单个 SQL 语句中完成整个操作。
如果您绝对必须将结果存储在一个集合中,请查看 bulk collect
首先,集合中不能直接插入,可以使用bulk collect into特性来实现
OPEN cur_tbl;
FETCH cur_tbl bulk collect into t_Pat_Trt;
CLOSE cur_tbl;