gpt4 book ai didi

oracle - PLS 00357 错误 - 上下文中不允许表、 View 或序列 "txt.col1"

转载 作者:行者123 更新时间:2023-12-05 06:33:53 24 4
gpt4 key购买 nike

我创建了一个存储过程。在该存储过程中,如果 col1col2 的值与员工匹配,则插入员工的唯一记录。如果未找到,则将 col1col2col3 的值与 employee 匹配匹配然后插入值。如果在匹配所有这些列时也没有找到,则使用另一列插入记录。还有一件事我想通过传递另一列值找到像 emp_id 这样的值列表,如果单个记录不能匹配然后制作 emp_id 作为 NULL

create or replace procedure sp_ex
AS
empID_in varchar2(10);
fname_in varchar2(20);
lname_in varchar2(30);
---------

type record is ref cursor return txt%rowtype; --Staging table
v_rc record;
rc rc%rowtype;
begin
open v_rc for select * from txt;
loop
fetch v_rc into rc;
exit when v_rc%notfound;
loop
select col1 from tbl1
Where EXISTS (select col1 from tbl1 where tbl1.col1 = rc.col1);

IF txt.col1 = rc.col1 AND txt.col2 = rc.col2 THEN
insert into main_table select distinct * from txt where txt.col2 = rc.col2;

ELSIF txt.col1 = rc.col1 AND txt.col2 = rc.col2 AND txt.col3 = rc.col3 THEN
insert into main_table select distinct * from txt where txt.col2 = rc.col2;

ELSE
insert into main_table select * from txt where txt.col4 = rc.col4;
end if;
end loop;
close v_rc;
end sp_ex;

我在编译此存储过程时发现错误 PLS-00357:在此上下文中不允许引用表、 View 或序列。如何解决此问题以及如何在使用 CASEIF ELSIF 语句时将值从暂存表插入主表。你能帮我编译存储过程吗?

最佳答案

因为我没有你的数据库可以使用,所以很难 100% 确定,但在我看来,这行内容是

rc rc%rowtype;

应该说

rc txt%rowtype;

您已将游标 v_rc 定义为返回 txt%rowtype,并且您使用此游标的 SQL 语句是 select * from txt , 但该数据类型与 rc 的定义不一致。因此,您似乎需要如图所示更改 rc

看起来 LOOP 语句紧跟在 exit when v_rc%notfound; 之后应该被删除,因为在那之后没有任何内容可以终止该循环。

此外,您对 txt 表中的列有很多引用,例如IF txt.col1 = rc.col1。您不能以这种方式引用表中的值。我不太确定你想在这里做什么,所以我真的不能提出任何建议。

还有声明

select col1 from tbl1
Where EXISTS (select col1 from tbl1 where tbl1.col1 = rc.col1);

正在从数据库中选择一个列,但没有将它放在任何地方。这应该是单例 SELECT (SELECT..INTO) 或游标。

还有一件事:你不能使用distinct *。您需要使用具有 distinct 的列列表。

也许以下内容与您正在尝试做的事情很接近:

create or replace procedure sp_ex
AS
begin
FOR rc IN (SELECT * FROM TXT)
LOOP
FOR t1 IN (SELECT *
FROM TBL1
WHERE TBL1.COL1 = rc.COL1)
LOOP
IF t1.COL1 = rc.COL1 AND
t1.COL2 = rc.COL2
THEN
insert into main_table
select *
from txt
where txt.col2 = rc.col2;
ELSIF t1.col1 = rc.col1 AND
t1.col2 = rc.col2 AND
t1.col3 = rc.col3
THEN
insert into main_table
select *
from txt
where txt.col2 = rc.col2;
ELSE
insert into main_table
select *
from txt
where txt.col4 = rc.col4;
END IF;
END LOOP; -- t1
END LOOP; -- rc
end sp_ex;

祝你好运。

关于oracle - PLS 00357 错误 - 上下文中不允许表、 View 或序列 "txt.col1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com