Ошибка (9,1): PLS-00428: в этом операторе SELECT ожидается предложение INTO при создании хранимых процедур. - PullRequest
0 голосов
/ 09 апреля 2020

Я создал SP, но при компиляции я получаю ошибку как

Ошибка (9,1): PLS-00428: в этом операторе SELECT ожидается предложение INTO

Ниже приведен SP

CREATE OR REPLACE PROCEDURE FIP_VALID_TBL_TRANSMEDIA 
 (
   POUTMSG OUT VARCHAR2
  )

 AS 
BEGIN

 SELECT distinct  TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID, TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
                                    from  APP_FTTX.span@SAT sp
                                    WHERE LENGTH(sp.RJ_SPAN_ID) = 21
                                    AND (sp.RJ_SPAN_ID LIKE ('%SPN%') OR sp.RJ_SPAN_ID LIKE ('%SPQ%') OR sp.RJ_SPAN_ID LIKE ('%SPR%')    
                                    OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
                                    AND (sp.RJ_SPAN_ID LIKE ('%_BU') OR sp.RJ_SPAN_ID LIKE ('%_MP'))
                                    AND sp.INVENTORY_STATUS_CODE = 'IPL'
                                    AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
                                    AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' OR 
      sp.RJ_INTRACITY_LINK_ID IS NULL)                                        
             MINUS

    SELECT distinct  TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID, TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS 
    MAINT_ZONE_CODE
                                    from  APP_FTTX.span@SAT sp
                                    INNER JOIN APP_FTTX.transmedia@SAT tm  -- transmedia added
                                    on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
                                    WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID)
                                    and sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE
                                    and sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE
                                    AND LENGTH(sp.RJ_SPAN_ID) = 21
                                    AND (sp.RJ_SPAN_ID LIKE ('%SPN%') OR sp.RJ_SPAN_ID LIKE ('%SPQ%') 
OR sp.RJ_SPAN_ID LIKE ('%SPR%')    
                                    OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
                                    AND (sp.RJ_SPAN_ID LIKE ('%_BU') OR sp.RJ_SPAN_ID LIKE ('%_MP'))
                                    AND sp.INVENTORY_STATUS_CODE = 'IPL'
                                    AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
                                    AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' OR 
sp.RJ_INTRACITY_LINK_ID IS NULL);

  NULL;
END FIP_VALID_TBL_TRANSMEDIA;

Пожалуйста, подскажите, что здесь не так

ОБНОВЛЕНИЕ

Таблица описания

           Name            Null Type           
           --------------- ---- -------------- 
           SPAN_ID              NVARCHAR2(100) 
           MAINT_ZONE_CODE      NVARCHAR2(100) 
           UPDATED_DATE         DATE           
           UPDATED_BY           NVARCHAR2(100)

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

я хочу вставить в эту процедуру только

Вы можете просто использовать insert ... select [синтаксис]:

CREATE OR REPLACE PROCEDURE FIP_VALID_TBL_TRANSMEDIA 
 (
   POUTMSG OUT VARCHAR2
  )

 AS 
BEGIN

 INSERT INTO TBL_VLD_FIBERINV_DATA (SNAP_ID, MAINT_ZONE_CODE)
 SELECT TO_CHAR(sp.RJ_SPAN_ID), TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE)
 ...
 MINUS
 SELECT TO_CHAR(sp.RJ_SPAN_ID), TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE)
 ...

Вам не нужно distinct с МИНУСОМ; а псевдонимы столбцов бесполезны.

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

 INSERT INTO TBL_VLD_FIBERINV_DATA (SNAP_ID, MAINT_ZONE_CODE, UPDATED_DATE, UPDATED_BY)
 SELECT TO_CHAR(sp.RJ_SPAN_ID), TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE), SYSDATE, USER
 ...
 MINUS
 SELECT TO_CHAR(sp.RJ_SPAN_ID), TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE), SYSDATE, USER
 ...

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

DECLARE
 OUTMSG VARCHAR2(4000);
BEGIN
 FIP_VALID_TBL_TRANSMEDIA (POUTMSG => OUTMSG);
END;
/

Вы должны объявить и передать переменную в соответствии с формальным аргументом процедуры, даже если вы в настоящее время не заполняете это. (Надеюсь, вы не собираетесь перехватывать исключения и помещать сообщение об исключении в эту переменную ...)


Кажется немного странным использовать nvarchar2 в вашей целевой таблице и иметь размер как 100 даже для идентификатора пользователя; и to_char() вызывает то, что уже выглядит как строки. Вы используете функцию to_char(char) , которая всегда возвращает varchar2, поэтому вставка в nvarchar2 кажется странной ...

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

В этой процедуре вы выполняете запрос, но нигде не размещаете результаты этого запроса. Я предлагаю переписать как:

CREATE OR REPLACE PROCEDURE FIP_VALID_TBL_TRANSMEDIA(POUTMSG OUT VARCHAR2)
AS 
BEGIN
  SELECT SPAN_ID || MAINT_ZONE_CODE
    INTO POUTMSG  -- puts result of query into POUTMSG
    FROM (SELECT distinct TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID,
                          TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
            from  APP_FTTX.span@SAT sp
            WHERE LENGTH(sp.RJ_SPAN_ID) = 21 AND
                  (sp.RJ_SPAN_ID LIKE ('%SPN%') OR
                   sp.RJ_SPAN_ID LIKE ('%SPQ%') OR
                   sp.RJ_SPAN_ID LIKE ('%SPR%') OR
                   sp.RJ_SPAN_ID LIKE ('%SPS%')) AND
                  (sp.RJ_SPAN_ID LIKE ('%_BU') OR
                   sp.RJ_SPAN_ID LIKE ('%_MP')) AND
                   sp.INVENTORY_STATUS_CODE = 'IPL' AND
                   sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01' AND
                  (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' OR 
                   sp.RJ_INTRACITY_LINK_ID IS NULL)                                        
          MINUS
          SELECT distinct TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID,
                          TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
            from  APP_FTTX.span@SAT sp
            INNER JOIN APP_FTTX.transmedia@SAT tm  -- transmedia added
              on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
            WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID) and
                  sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE and
                  sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE AND
                  LENGTH(sp.RJ_SPAN_ID) = 21 AND
                  (sp.RJ_SPAN_ID LIKE ('%SPN%') OR
                   sp.RJ_SPAN_ID LIKE ('%SPQ%') OR
                   sp.RJ_SPAN_ID LIKE ('%SPR%') OR
                   sp.RJ_SPAN_ID LIKE ('%SPS%')) AND
                  (sp.RJ_SPAN_ID LIKE ('%_BU') OR
                   sp.RJ_SPAN_ID LIKE ('%_MP')) AND
                   sp.INVENTORY_STATUS_CODE = 'IPL' AND
                   sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01' AND
                  (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' OR 
                   sp.RJ_INTRACITY_LINK_ID IS NULL);
END FIP_VALID_TBL_TRANSMEDIA;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...