PROC 컴파일 중인데요.. 자꾸 오류가 나여.. 0 8 10,802

by 민석님 [2014.01.17 11:14:49]


사용하고 있는 데이터 베이스는 오라클 10G입니다.
아래 쿼리를 오랜지에서 실행을 하면 잘 되는데요.. PROC에서 컴파일 하면 자꾸 오류가 나여..

이유가 뭘까요?? 도무지 모르겠습니다.


EXEC SQL
    INSERT INTO
    STG0011 (        INS_DATE            ,
SEQ_NO              ,
PROC_GB             ,
GYEJA_NO            ,
GYEJA_GB            )
    SELECT          :current_date,
(
SELECT NVL(MAX(SEQ_NO)+1,0)
FROM    STG0011
WHERE   INS_DATE = :current_date
),
:proc_gb ,
GYEJA_NO            ,
GYEJA_GB            
    FROM         TABLE_NAME
    WHERE       GYEJA_NO    = :gyeja_no
    AND            GYEJA_GB    = :gyeja_gb
    AND           STG_NO      = :stg_no    ;




오류 메시지 입니다.


        /app/oracle/product/10.2/bin/proc INCLUDE=/app/oracle/product/10.2/precomp/public  INCLUDE=/app/oracle/product/10.2/rdbms/public    INCLUDE=/app/oracle/product/10.2/plsql/public LTYPE=NONE MODE=ORACLE DBMS=V7 PARSE=NONE SQLCHECK=SEMANTICS  USERID=STS_APP/STS_APP_STS@SEAM LINES=YES iname=dd_sp26a.pc

Pro*C/C++: Release 10.2.0.3.0 - Production on Fri Jan 17 11:20:31 2014

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

System default option values taken from: /app/oracle/product/10.2/precomp/admin/pcscfg.cfg

Syntax error at line 2303, column 14, file dd_sp26a.pc:
Error at line 2303, column 14 in file dd_sp26a.pc
                                                SELECT NVL(MAX(SEQ_NO)+1,0) 
.............1
PCC-S-02201, Encountered the symbol "NVL" when expecting one of the following:

   ( ) * + - / . @ | at, day, hour, minute, month, second, year,
The symbol "(" was substituted for "NVL" to continue.

Syntax error at line 2304, column 7, file dd_sp26a.pc:
Error at line 2304, column 7 in file dd_sp26a.pc
                                                FROM    STG0011
......1
PCC-S-02201, Encountered the symbol "FROM" when expecting one of the following:

   , ) * + - / | at, day, hour, minute, month, second, year,

Syntax error at line 2306, column 6, file dd_sp26a.pc:
Error at line 2306, column 6 in file dd_sp26a.pc
                                        ),
.....1
PCC-S-02201, Encountered the symbol ")" when expecting one of the following:

   ; : ( [ * + - / . | ++ -- -> union, at, connect, indicator,
   and, group, having, intersect, minus, or, start, with, day,
   hour, minute, month, second, year,

Error at line 0, column 0 in file dd_sp26a.pc
PCC-F-02102, Fatal error while doing C preprocessing
make: The error code from the last command is 1.


by 용근님 [2014.01.17 11:19:03]
PreCompile 에러구요. 현재 올리신 쿼리랑 에러메시지랑은 전혀 다른 문제 같은데요

by 민석님 [2014.01.17 11:23:26]
오류메시지 수정했습니다..ㅜㅜ;;

해당 부위를 주석 처리가 되어져있었내요~~

by 강서꽃미남 [2014.01.17 11:30:35]
써있네요.;;; 신텍스에러 쿼리문장 다시 확인해보셔요

by 용근님 [2014.01.17 11:30:59]
서브쿼리 받아오는 부분이 문제인거 처럼 보이기도 하네요


(
    SELECT NVL(MAX(SEQ_NO)+1,0)
FROM    STG0011
WHERE   INS_DATE = :current_date
),


이부분을 따로 그전 Exec sql 에서 값 SET 하고 Insert 할때 SET한값을 넣어봐주시겠어요?

by 민석님 [2014.01.17 13:04:28]
좀 자세히 설명좀 해주세요..^_^;; 이해가 잘안되여.. 
(혹시 쿼리를 분리하라는 말씀이신가요?? 그럼 잘됩니다.)

그리고 
(
SELECT NVL(MAX(SEQ_NO)+1,0) 
FROM    STG0011
)

아래 처럼 해도 안됩니다.

그리고 여기 저기 찾아보니.. proc에서 서브쿼리가 잘안되는 경우가 있다고 하더라구요..
그리고.. 저것을 한방에 해결할수 있는 방법이 뭐가 있을까요???

by 용근님 [2014.01.17 14:27:57]
동적쿼리로는 한방에 되지요.

테스트 환경이 안되서 예전 기억을 더듬는점 양해바래요..


이런식 ->

exec sql
SELECT NVL(MAX(SEQ_NO)+1,0) 
INTO v_seq
FROM    STG0011
;

exec sql 
insert table
...
select
:current_date
, :v_seq
....
....

by feel [2014.01.17 14:35:29]

precompiler 버전에 낮으면
proc에서 분석함수, 스칼라 서브쿼리.. 등등 을 사용못하는 것들이 있습니다.

예전에 한 방법이라 정확히 기억이 나질 않네요.
proc에서도 쿼리문을 문자열에 넣어서 쿼리를 수행할수 있습니다.
그렇게 문자열에 넣고 수행하면 precompiler 가 지원하지 않는 부분을 해결했던것 같습니다.

이런쿼리도 가능할지 모르겠네요..

EXEC SQL
INSERT INTO
STG0011 (     INS_DATE ,
SEQ_NO   ,
PROC_GB ,
GYEJA_NO     ,
GYEJA_GB     )
    SELECT  
:current_date,
decode(NO,0, rownum-1, no+rownum),
:proc_gb ,
GYEJA_NO     ,
GYEJA_GB    
    FROM TABLE_NAME, (SELECT NVL(MAX(SEQ_NO)+1,0) NO FROM    STG0011 WHERE   INS_DATE = :current_date) B
    WHERE    GYEJA_NO    = :gyeja_no
    AND     GYEJA_GB    = :gyeja_gb
    AND    STG_NO   = :stg_no    ;

by 민석님 [2014.01.17 14:47:06]
저렇게 작성하니 잘 되더라구요..^^


감사합니다..
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입