问题
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