PLS 00357错误 - 表,视图或序列" txt.col1"上下文中不允许

时间:2018-05-21 10:38:11

标签: oracle stored-procedures plsql cursor

我创建了一个存储过程。在那个存储过程中我想要的是 col1 & col2 与员工匹配,然后插入员工的唯一记录。如果未找到,则匹配 col1 col2 &的值 col3 员工 匹配,然后插入值。如果在匹配所有这些列时也找不到,则使用另一列插入记录。 还有一件事我需要通过传递另一个列值找到像 emp_id 这样的值列表,如果单个记录不能匹配,那么make emp_id as 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: Table,View Or Sequence reference not allowed in this context时发现错误。如何解决此问题以及如何在使用 CASE IF ELSIF 语句时将值从登台插入主表。你能不能帮助我,以便我可以编译存储过程。

1 个答案:

答案 0 :(得分:1)

由于我没有使用您的数据库,因此难以100%确定,但在我看来,读取的行

$(function () {
    $("#ImageId").change(function (evt) {
        var DropDownSelectedVal = $("#ImageId :selected").val();
        alert(DropDownSelectedVal);
        if (DropDownSelectedVal != null) {
            alert("Success");
            $.ajax({
                url: "@Url.Action("GetImage", "CardImages")",
                type: "POST",
                dataType: 'json',
                contentType: "application/json;charset-utf-8",
                data: "{'id':'" + DropDownSelectedVal+ "'}",
                success: function (data) {
                    alert("Success");
                    $("img-upload2").attr('src', data);
                },
                error: function (xhr) {
                    alert("Something went wrong, please try again");
                }
            });
        }
    });
});

应该说

rc rc%rowtype;

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

看起来rc语句应该在LOOP之后立即删除,因为在此之后没有任何内容可以终止该循环。

此外,您对exit when v_rc%notfound;表格中的列有很多引用,例如txt。您不能以这种方式引用表中的值。我不太确定你在这里做了什么,所以我无法提出任何建议。

此外,声明

IF txt.col1 = rc.col1

正在从数据库中选择一列,但并未将其放在任何位置。这应该是单身SELECT(select col1 from tbl1 Where EXISTS (select col1 from tbl1 where tbl1.col1 = rc.col1); )或光标。

还有一件事:你不能使用SELECT..INTO。您需要使用包含distinct *的列列表。

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

distinct

祝你好运。