Ошибка PLS 00357 - таблица, представление или последовательность "txt.col1" не допускаются в контексте - PullRequest
0 голосов
/ 21 мая 2018

Я создал одну хранимую процедуру .В этом сохраненном процессе я хочу, чтобы значение col1 & col2 соответствовало сотруднику, а затем вставляю уникальную запись сотрудника.Если не найдено, сопоставьте значение col1 , col2 & col3 с соответствием 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: Table,View Or Sequence reference not allowed in this context.Как решить эту проблему и как вставить значение из промежуточной в основную таблицу при использовании оператора CASE или IF ELSIF .Не могли бы вы помочь мне, чтобы я мог скомпилировать сохраненный процесс.

1 Ответ

0 голосов
/ 21 мая 2018

Поскольку у вас нет базы данных для работы, трудно быть на 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;

Best of luck.

...