database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39065 게시물 읽기
No. 39065
프로시져 컴파일이 안됩니다.
작성자
정혁채(postgood)
작성일
2011-11-08 14:50
조회수
5,880

 아무리 봐도 문법은 맞는거 같은데 자꾸 에러가 납니다.

아래 소스 검토 부탁드립니다.

------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE PROCEDURE EAMR4007HIGHMONTH_INSERT

(

IN_METERNUM IN VARCHAR2,

IN_METERDATE IN CHAR,

IN_BRANCHCD     IN VARCHAR2,

IN_METERMGRNUM  IN NUMBER

)

IS

ST_VALID NUMBER(25,12);

ST_NULLITYLAG NUMBER(25,12);

ST_NULLITYLEAD NUMBER(25,12);

ST_APPARENT NUMBER(25,12);

ST_FACTOR NUMBER(25,12);

ST_LPVALUE NUMBER(25,12);

ST_TOTALLPVALUE NUMBER(25,12);

ST_METERDATE     CHAR(14);

ST_CNT INTEGER;

ST_LASTDAY       CHAR(2);

ST_QUERY   VARCHAR2(200);

ST_COLUM   VARCHAR2(20);

ST_COLUM2 VARCHAR2(20);

ST_TEMP VARCHAR2(1000);

 

BEGIN

 

/**********************************************************************

 - 시간 사용량 구하기

**********************************************************************/

SELECT

    SUM(VALID) INTO ST_VALID

    FROM EAMR4001HIGHSOURCE

    WHERE METERMGRNUM = IN_METERMGRNUM

    AND YYYY = SUBSTR(IN_METERDATE,0,4)

        AND MM = SUBSTR(IN_METERDATE,5,2);

SELECT

        SUM(NULLITYLAG) INTO ST_NULLITYLAG

    FROM EAMR4001HIGHSOURCE

    WHERE METERMGRNUM = IN_METERMGRNUM

    AND YYYY = SUBSTR(IN_METERDATE,0,4)

        AND MM = SUBSTR(IN_METERDATE,5,2);

SELECT

        SUM(NULLITYLEAD) INTO ST_NULLITYLEAD

    FROM EAMR4001HIGHSOURCE

    WHERE METERMGRNUM = IN_METERMGRNUM

    AND YYYY = SUBSTR(IN_METERDATE,0,4)

        AND MM = SUBSTR(IN_METERDATE,5,2);

SELECT

        SUM(APPARENT) INTO ST_APPARENT

    FROM EAMR4001HIGHSOURCE

    WHERE METERMGRNUM = IN_METERMGRNUM

    AND YYYY = SUBSTR(IN_METERDATE,0,4)

        AND MM = SUBSTR(IN_METERDATE,5,2);

SELECT

        MAX(METERDATE) INTO ST_METERDATE

    FROM EAMR4001HIGHSOURCE

    WHERE METERMGRNUM = IN_METERMGRNUM

    AND YYYY = SUBSTR(IN_METERDATE,0,4)

        AND MM = SUBSTR(IN_METERDATE,5,2);

 

SELECT

        MAX(LPVALUE) INTO ST_LPVALUE

    FROM EAMR4003HIGHHOUR

    WHERE METERMGRNUM = IN_METERMGRNUM

    AND YYYY = SUBSTR(IN_METERDATE,0,4)

        AND MM = SUBSTR(IN_METERDATE,5,2);

 

 

-- 역율 구하기

ST_FACTOR := ST_VALID / ST_APPARENT;

 

 

MERGE INTO EAMR4007HIGHMONTH

         USING DUAL

         ON ( METERNUM = IN_METERNUM AND YYYYMM = SUBSTR(IN_METERDATE,0,6))

         WHEN MATCHED THEN

              UPDATE SET

                  VALID = ST_VALID,

                  NULLITYLAG = ST_NULLITYLAG,

                  NULLITYLEAD = ST_NULLITYLEAD,

                  APPARENT = ST_APPARENT,

                  FACTOR = ST_FACTOR,

                  LASTCHECKDATE = ST_METERDATE,

                  EDITDATE = TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')

         WHEN NOT MATCHED THEN

              INSERT (

                  METERNUM,

                  YYYY,

                  MM,

                  YYYYMM,

                  VALID,

                  NULLITYLAG,

                  NULLITYLEAD,

                  APPARENT,

                  FACTOR,

                  INDATE,

                  METERMGRNUM,

                  MONTHDATANUM,

                  LPVALUE,

                  BRANCHCD

              ) VALUES (

                  IN_METERNUM,

                  SUBSTR(IN_METERDATE,0,4),

                  SUBSTR(IN_METERDATE,5,2),

                  SUBSTR(IN_METERDATE,0,6),

                  ST_VALID,

                  ST_NULLITYLAG,

                  ST_NULLITYLEAD,

                  ST_APPARENT,

                  ST_FACTOR,

                  TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'),

                  IN_METERMGRNUM,

                  MONTHDATANUM.NEXTVAL,

                  ST_LPVALUE,

                  IN_BRANCHCD

              );

 

-- 일별월통계 등록 하기

   SELECT SUM(VALID) INTO ST_TOTALLPVALUE FROM EAMR4007HIGHMONTH WHERE METERNUM = IN_METERNUM AND YYYY = SUBSTR(IN_METERDATE,0,4) AND MM = SUBSTR(IN_METERDATE,5,2);

   ST_COLUM := 'M' || SUBSTR(IN_METERDATE,8,2);

   ST_COLUM2 := ST_COLUM || 'VALUE';

 

    MERGE INTO EAMR4103HIGHMONTHYEAR

         USING DUAL

         ON ( METERMGRNUM = IN_METERMGRNUM AND YYYY = SUBSTR(IN_METERDATE,0,4))

         WHEN MATCHED THEN

          ST_TEMP := 'UPDATE EAMR4103HIGHMONTHYEAR SET '

            || ST_COLUM ||' = '|| TO_CHAR(ST_VALID,'9999999999999999.999999') 

                                ||', '|| ST_COLUM2 ||'='|| TO_CHAR(ST_LPVALUE,'9999999999999999999999999.999999999999')

                                ||', TOTAL = '|| TO_CHAR(ST_TOTALLPVALUE,'9999999999999999999999999.999999999999') 

                                ||' WHERE ' 

                                ||   'METERMGRNUM = '||  '''' || TO_CHAR(IN_METERMGRNUM,'9999999999') || '''' 

                                ||   ' AND YYYY = '|| '''' || SUBSTR(IN_METERDATE,0,4) || ''''

                                

         WHEN NOT MATCHED THEN

            ST_TEMP := 'INSERT INTO EAMR4103HIGHMONTHYEAR '

            || '(METERMGRNUM,YYYY,'|| ST_COLUM || ', ' || ST_COLUM2 || ',TOTAL,BRANCHCD,INDATE) '

                                || 'VALUE ('

                                || TO_CHAR(IN_METERMGRNUM,'9999999999')  

                                ||','''

                                || SUBSTR(IN_METERDATE,0,4) 

                                ||''','

                                || TO_CHAR(ST_VALID,'9999999999999999.999999') 

                                ||','

                                || TO_CHAR(ST_VALUE,'9999999999999999999999999.999999999999') 

                                ||','

                                || TO_CHAR(ST_VALID,'9999999999999999999999999.999999999999') 

                                ||',''' 

                                || IN_BRANCHCD 

                                ||''','''

                                ||  TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS') 

                                ||''')';

 

EXECUTE IMMEDIATE ST_TEMP;

 

 

END EAMR4007HIGHMONTH_INSERT;

 

-------------------------------------------------------------------------- -----------------------------------------

 

빨강색 부분에서 문법이 오류가 났다고 합니다.

뭐가 문제 인가요 ㅜㅜ

 

 

 

이 글에 대한 댓글이 총 2건 있습니다.

저같으면 에러 찾기도 쉽고 다른 개발자가 봐서 수정가능하게 

보기 좋게 작업을 하겠습니다.

그렇게 만들면 본인도 보기 어렵겠죠..


전 이런식으로 작성하겠습니다.


ST_TEMP := '

        UPDATE   EAMR4103HIGHMONTHYEAR

        SET      st_colum    = TO_CHAR(:ST_VALID, '9999999999999999.999999')

                ,st_colum2   = TO_CHAR(:ST_LPVALUE, '9999999999999999999999999.999999999999')

                ,total       = TO_CHAR(:ST_TOTALLPVALUE, '9999999999999999999999999.999999999999')

        WHERE    metermgrnum = TO_CHAR(:IN_METERMGRNUM, '9999999999')

        AND      yyyy        = SUBSTR(:IN_METERDATE, 0, 4)

';



EXECUTE IMMEDIATE ST_TEMP USING IN ST_VALID, ST_LPVALUE, ST_TOTALLPVALUE, IN_METERMGRNUM, IN_METERDATE;

            

박봉기(park17)님이 2011-11-08 16:10에 작성한 댓글입니다.
이 댓글은 2011-11-08 16:11에 마지막으로 수정되었습니다.

SQL 구문과 PL/SQL 구문은 서로 다릅니다.

머지구문은 SQL 구문이구요.

변수에 값을 대입하는 구문은 PL/SQL 구문인데요.

이걸 짬뽕 하셨네요.

PL/SQL 구문 안에 SQL이 포함되지만 반대로 SQL 구문 안에 PL/SQL이 올수는 없습니다.

마농(manon94)님이 2011-11-08 16:45에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39071매장에 연속3일 방문한 고객을 추출하는 쿼리. 가능할까요??
곰두리
2011-11-09
3893
39070oracle 9i 입니다. disconnect 처리가 안되면.. [1]
황선규
2011-11-09
3862
39067여러개의 테이블을 비교 업데이트를.. [2]
오늘도 밤샘
2011-11-08
5299
39065프로시져 컴파일이 안됩니다. [2]
정혁채
2011-11-08
5880
39064조인? 쿼리질문입니다 [1]
은우
2011-11-08
4192
39061ORA-24374 에러가 발생합니다. [1]
정자영
2011-11-07
7907
39059Oracle 10g에서 Partition table 사용하려면 라이센스 구매해야 하나요? [3]
이석천
2011-11-07
7609
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.034초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다