Error(9,1): PLS-00428: an INTO clause is expected in this SELECT statement while creating stored procedures

删除回忆录丶 提交于 2020-04-17 22:06:07

问题


I have created a SP, but while compiling I am getting error as

Error(9,1): PLS-00428: an INTO clause is expected in this SELECT statement

Below is the 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;

Please suggest what is wrong here

UPDATE

Table descriptiom

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

回答1:


i want to insert in this procedure only

You can just use the insert ... select [syntax]:

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)
 ...

You don't need distinct with MINUS; and the column aliases aren't useful.

Or if you want to set the other columns, and they don't already default, you can include values for those in the query part - here using the system time and current user:

 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
 ...

You need to execute the procedure for it to actually do anything; just creating or compiling it doesn't cause the code within it (i.e. the insert) to be run. You can do that from a simple anonymous block:

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

You have to declare and pass a variable to match the procedure's formal argument, even though you don't currently populate that. (Hopefully you don't intend to catch exceptions and put the exception message into that variable...)


It seems a bit odd to be using nvarchar2 in your target table, and to have the size as 100 even for user ID; and to have to_char() calls for what appear to already be strings. You're using the to_char(char) function which always returns varchar2, so then putting that into nvarchar2 seems strange...




回答2:


In this procedure you're executing a query but you're not putting the results of that query anywhere. I suggest rewriting as:

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;


来源:https://stackoverflow.com/questions/61125477/error9-1-pls-00428-an-into-clause-is-expected-in-this-select-statement-while

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!