虽然INSERT得到了像PLS-00904这样的错误:txt.col1是无效的标识符

时间:2018-05-29 09:53:41

标签: sql oracle stored-procedures plsql

在我的存储过程中,如果 col1 的值为& col2 与员工匹配,然后插入员工的唯一记录。如果未找到,则匹配 col1 col2 &的值 col3 员工 匹配,然后插入值。如果在匹配所有这些列时也找不到,则使用另一列插入记录。 我们必须使用集合以及条件,然后插入。 还有一件事我需要通过传递另一个列值查找 emp_id 等值列表,如果单个记录不能匹配,那么make emp_id as NULL

此外,我想在与 txt 匹配后一次插入一条记录,以及其他包含 \ temp 等数据的表格。

create or replace procedure sp_ex
as
    cursor c1 is select * from txt%rowtype;
    v_col1 tbl1.col1%type;
    type record is table of txt%rowtype;  --Staging table
    v_rc record := record();
begin
    open c1;
    loop 
        fetch c1 bulk collect into v_rc limit 1000;

        loop
            for i in 1..v_rc.count loop
                select col1 into v_col1 from tbl1
                where  exists (select col1 from tbl1 where tbl1.col1 = emp.col1);

                insert 
                    when txt.col1 = emp.col1 and txt.col2 = stud.col2 then
                         into main_table(columns) values(v_rc(i).col1, ...)

                    when txt.col1 = emp.col1 and txt.col2 = stud.col2 and txt.col3 = stud.col3 then 
                         into main_table(columns) values(v_rc(i).col1, ...)

                    else 
                         insert into main_table(columns) values(v_rc(i).col1, ...)
                         select * from txt;
                end loop;
                exit when v_rc.count < limit;

        end loop;
        close c1;
end sp_ex;

虽然 emp stud 是我必须与 txt 匹配的不同表格。 在该存储过程中,我想在批处理模式下将 txt 中的数据加载到 main_table 中。如果匹配条件匹配,则数据将逐个匹配,然后加载到主表中。 与 emp 表一样,( col1 eid ename addr )列和 stud 表( col2 sid sname addr )。如何创建存储过程,以便数据将在批处理中逐个加载逻辑。能帮我分享一下你的想法吗?感谢

1 个答案:

答案 0 :(得分:0)

我们仍然没有得到你的桌子结构所以我会给你一个关于你能做的最蠢的事情的骷髅想法。如果您希望我们为您提供最佳解决方案,请提供表格结构。没有测试,所以如果您有任何疑问,请测试并告诉我。

create or replace
procedure sp_ex
as
cursor c1 is select txt.col1,txt.col2,txt.col3,(select emp.col1 from emp where emp.col1=txt.col1) as empcol1,(select stud.col2 from stud where stud.col2=txt.col2)studcol1 from txt;
v_col1 txt.col1%type;
type record is table of c1%rowtype;  --Staging table
v_rc record := record();
begin
open c1;
loop 
    fetch c1 bulk collect into v_rc limit 1000;
    exit when v_rc.count=0;
        for i in 1..v_rc.count loop

        --Your logic goes here 

            end loop;


    end loop;
    close c1;
end sp_ex;