Невозможно вставить записи в таблицу, используя курсор в oracle - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу вставить записи в таблицу, используя cursor. Ниже приведен запрос для того же.

CREATE OR REPLACE PROCEDURE FIBER_TRANSM_VALID_DATA 
AS 

BEGIN

DECLARE

SPANID NVARCHAR2(50);
MZONENAME NVARCHAR2(50);


CURSOR CR_SPAN_VALID_DATA IS

 SELECT RJ_SPAN_ID, RJ_MAINTENANCE_ZONE_NAME
        FROM APP_FTTX.transmedia@SAT
        WHERE  LENGTH(RJ_SPAN_ID) = 21
       AND INVENTORY_STATUS_CODE = 'IPL'
       AND REGEXP_LIKE(rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
       AND RJ_MAINTENANCE_ZONE_CODE IN ('INMUNVMB01')
       AND ROWNUM < 11;  


BEGIN      
    OPEN CR_SPAN_VALID_DATA;
    LOOP    
    FETCH CR_SPAN_VALID_DATA INTO SPANID, MZONENAME;
    EXIT WHEN CR_SPAN_VALID_DATA%NOTFOUND;    

    IF SPANID > 0
    THEN
        BEGIN                              
            INSERT INTO TBL_FIBER_VALID_TRANS_DATA (RJ_SPAN_ID, RJ_MAINTENANCE_ZONE_NAME)
            VALUES (SPANID, MZONENAME);           

        END;
       END IF; 
          COMMIT;

       END LOOP;  
  CLOSE CR_SPAN_VALID_DATA;  

END;
END FIBER_TRANSM_VALID_DATA;

Но я получаю ошибку как

Ошибка (36,13): PL / SQL: SQL Заявление игнорируется ошибка (36,65): PL / SQL: ORA-00904: «RJ_MAINTENANCE_ZONE_NAME»: неверный идентификатор

обновление

структура таблицы ниже

SPAN_ID                       NVARCHAR2(50)  
MAINTENANCE_ZONE_NAME         NVARCHAR2(50)  
MAINTENANCE_ZONE_CODE         NVARCHAR2(50)  
R4G_STATE_NAME                NVARCHAR2(50)  
STATE_NAME                    NVARCHAR2(50)  
NETWORK_CATEGORY              NVARCHAR2(100) 
NETWORK_TYPE                  NVARCHAR2(100) 
CONSTRUCTION_METHODOLOGY      NVARCHAR2(50)  
INVENTORY_STATUS_CODE         NVARCHAR2(20)  
OWNERSHIP_TYPE_CODE           NVARCHAR2(20)  
ROUTE_NAME                    NVARCHAR2(100) 
INTRACITY_LINK_ID             NVARCHAR2(100) 
CALCULATED_LENGTH             NUMBER(38,8)   
LAST_UPDATED_BY               NVARCHAR2(100) 
LAST_UPDATED_DATE             DATE 

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Если это должен быть курсор l oop, см. Другой подход - курсор FOR l oop. Писать и поддерживать намного проще, так как Oracle делает большинство вещей за вас, то есть вам не нужно явно объявлять курсор и переменную (и) курсора, открывать его, извлекать из него, обращать внимание, когда выходить из l oop, закройте курсор. Все, что грязная работа сделана для вас.

Все, о чем вам нужно беспокоиться, это то, что select, который вы написали, на самом деле возвращает несколько строк, потому что я видел комментарий, который вы написали, - хотя процедура был скомпилирован, он не вставил никаких строк. Поскольку у нас нет ваших данных, мы не можем с этим поделать.

Здесь вы go (при условии, что таблицы и столбцы действительно существуют):

create or replace procedure fiber_transm_valid_data as 
begin
  for cur_r in (select rj_span_id, 
                       rj_maintenance_zone_name
                from app_fttx.transmedia@sat
                where length(rj_span_id) = 21
                  and inventory_status_code = 'IPL'
                  and regexp_like(rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
                  and rj_maintenance_zone_code in ('INMUNVMB01')
               )
  loop               
    if cur_r.rj_span_id > '0' then
       insert into tbl_fiber_valid_trans_data 
         (span_id, maintenance_zone_name)
       values (cur_r.rj_span_id, cur_r.rj_maintenance_zone_name);
    end if;
  end loop;  
end fiber_transm_valid_data;

Еще несколько замечаний: не COMMIT в l oop, поскольку это вызывает проблемы (например, снимок слишком старый ошибка). Подумайте об удалении из процедуры и позвольте вызывающему абоненту решить, следует ли совершать или нет.

Вы действительно выполняли процедуру? Вы создали его, но - если вы никогда не вызывали его, это может быть причиной, по которой вы не видите вставляемых строк. Итак:

begin
  fiber_transm_valid_data ;
end;
/
1 голос
/ 16 апреля 2020

Весь ваш код PL / SQL может быть записан простым INSERT INTO..SELECT. Нет необходимости циклически проходить каждую запись в курсоре, просто сделайте это простым SQL:

INSERT INTO TBL_FIBER_VALID_TRANS_DATA 
  (SPAN_ID, MAINTENANCE_ZONE_NAME)
SELECT RJ_SPAN_ID, RJ_MAINTENANCE_ZONE_NAME
FROM APP_FTTX.transmedia@SAT
WHERE  LENGTH(RJ_SPAN_ID) = 21
AND INVENTORY_STATUS_CODE = 'IPL'
AND REGEXP_LIKE(rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
AND RJ_MAINTENANCE_ZONE_CODE IN ('INMUNVMB01')
AND ROWNUM < 11
AND SPAN_ID > 0; --> This is the check you are using in your PL/SQL code

И ROWNUM <11 </p>

Я надеюсь, что вы знаете, что ROWNUM просто даст вам случайные строки, которые он выберет, он не будет в каком-то определенном порядке, если вы не упомянете ORDER BY, а затем не примените rownum поверх этого. В вашем коде вы получите 10 случайных строк. Чтобы понять больше, см. Как работает ROWNUM .

...