开发者

oracle insert and complex select. what's wrong?

开发者 https://www.devze.com 2023-01-25 16:58 出处:网络
i have some complex select and result need to place in the table. I try this: INSERT INTO SAMGUPS_STATISTIC_STANTION

i have some complex select and result need to place in the table. I try this:

INSERT INTO SAMGUPS_STATISTIC_STANTION
(SAMGUPS_STATISTIC_STANTION_SEQ.nextval)
(
with PRG as (
select
 ID_OBJ
from PEREGON where ID_STAN1=&arrival
),
STN_OBJ as (
          select
          distinct ID_OBJ_P as ID_OBJ
          from TMO start with ID_OBJ=&dispatch
          connect by prior ID_OBJ_P=ID_OBJ
),
STAN as (
          select
          A_TOP.ID_POEZD
          ,A_TOP.vrsvop
          from STN_OBJ inner join A_TOP on A_TOP.ID_OBJ=STN_OBJ.ID_OBJ and A_TOP.KODOP_P in ('01','07')
          left join A_POEZD_ATR ATR on ATR.ID_POEZD=A_TOP.ID_POEZD and ATR.VRSVOP=A_TOP.VRSVOP
          WHER开发者_StackOverflow社区E ATR.NOM_POEZD LIKE '____'
),
DATA_RESULT as 
(
          select
          /*count(*) over() as TotalCount*/
          to_char(&dispatch) as dispatch
          ,to_char(&arrival) as arrival
          ...
          ,ATR.PR_N_V_PZ
          from PRG inner join A_TOP on A_TOP.ID_OBJ=PRG.ID_OBJ and  A_TOP.KODOP_P in ('03','07')
                    left join A_POEZD_ATR ATR on ATR.ID_POEZD=A_TOP.ID_POEZD and ATR.VRSVOP=A_TOP.VRSVOP
                    inner join STAN STN on STN.ID_POEZD = ATR.ID_POEZD  
                    WHERE ATR.NOM_POEZD LIKE '____'
                    order by A_TOP.ID_POEZD
)
SELECT * FROM DATA_RESULT);

i have error:

Error at Command Line:71 Column:25
Error report:
SQL Error: ORA-32034: unsupported use of WITH clause
32034. 00000 -  "unsupported use of WITH clause"
*Cause:    Inproper use of WITH clause because one of the following two reasons
           1. nesting of WITH clause within WITH clause not supported yet
           2. For a set query, WITH clause can't be specified for a branch.
           3. WITH clause can't sepecified within parentheses.
*Action:   correct query and retry

Whether there is to circumvent these restrictions? May be possible result of select place into variable and then using variable insert to table?


WITH clause can't sepecified within parentheses.

try rewrite smth like this

INSERT INTO SAMGUPS_STATISTIC_STANTION
with PRG as (
select
 ID_OBJ
from PEREGON where ID_STAN1=&arrival
),
STN_OBJ as (
          select
          distinct ID_OBJ_P as ID_OBJ
          from TMO start with ID_OBJ=&dispatch
          connect by prior ID_OBJ_P=ID_OBJ
),
STAN as (
          select
          A_TOP.ID_POEZD
          ,A_TOP.vrsvop
          from STN_OBJ inner join A_TOP on A_TOP.ID_OBJ=STN_OBJ.ID_OBJ and A_TOP.KODOP_P in ('01','07')
          left join A_POEZD_ATR ATR on ATR.ID_POEZD=A_TOP.ID_POEZD and ATR.VRSVOP=A_TOP.VRSVOP
          WHERE ATR.NOM_POEZD LIKE '____'
),
DATA_RESULT as 
(
          select
          /*count(*) over() as TotalCount*/
          to_char(&dispatch) as dispatch
          ,to_char(&arrival) as arrival
          ...
          ,ATR.PR_N_V_PZ
          from PRG inner join A_TOP on A_TOP.ID_OBJ=PRG.ID_OBJ and  A_TOP.KODOP_P in ('03','07')
                    left join A_POEZD_ATR ATR on ATR.ID_POEZD=A_TOP.ID_POEZD and ATR.VRSVOP=A_TOP.VRSVOP
                    inner join STAN STN on STN.ID_POEZD = ATR.ID_POEZD  
                    WHERE ATR.NOM_POEZD LIKE '____'
                    order by A_TOP.ID_POEZD
)
SELECT SAMGUPS_STATISTIC_STANTION_SEQ.nextval,  DATA_RESULT.* FROM DATA_RESULT;


  1. No need for an ORDER BY on an INSERT.

  2. An INSERT is coded like this: INSERT INTO mytable (mycolumn, ...) SELECT ...

Try something like this:

INSERT INTO SAMGUPS_STATISTIC_STANTION
(dispatch, arrival, ..., PR_N_V_PZ)
          select
          to_char(&dispatch) as dispatch
          ,to_char(&arrival) as arrival
          ...
          ,ATR.PR_N_V_PZ
          from (select
                 ID_OBJ
                from PEREGON where ID_STAN1=&arrival
                )
          inner join A_TOP on A_TOP.ID_OBJ=PRG.ID_OBJ and  A_TOP.KODOP_P in ('03','07')
                    left join A_POEZD_ATR ATR on ATR.ID_POEZD=A_TOP.ID_POEZD and ATR.VRSVOP=A_TOP.VRSVOP
                    inner join (select
                                A_TOP.ID_POEZD
                                ,A_TOP.vrsvop
                                from (select
                                      distinct ID_OBJ_P as ID_OBJ
                                      from TMO start with ID_OBJ=&dispatch
                                      connect by prior ID_OBJ_P=ID_OBJ
                                ) inner join A_TOP on A_TOP.ID_OBJ=STN_OBJ.ID_OBJ and A_TOP.KODOP_P in ('01','07')
                                left join A_POEZD_ATR ATR on ATR.ID_POEZD=A_TOP.ID_POEZD and ATR.VRSVOP=A_TOP.VRSVOP
                                WHERE ATR.NOM_POEZD LIKE '____') STN
                            on STN.ID_POEZD = ATR.ID_POEZD  
                    WHERE ATR.NOM_POEZD LIKE '____';
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号