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 40472 게시물 읽기
No. 40472
인서트 프로시저에서 특정칼럼 때문에 질문드립니다.
작성자
도토리(dododori)
작성일
2014-05-26 14:16ⓒ
2014-05-26 14:48ⓜ
조회수
7,957

안녕하세요 오라클 초보 인사드립니다.

쿼리 수정하다가 막혀서..오랜만에 질문 드립니다.

프로시저는 계획을 생성하는 프로시저구 반기마다 생성해요~

그러니까 2014년상반기, 2014년하반기 이렇게요.

단말기를 가지고 나가서 계획에서 생성된 칼럼에 있는 메모란에다 내용을 넣구요.

2014년하반기에 또 계획을 생성시키는데

2014년상반기에 있는 메모데이터가 계획생성할때 자동으로 고객에 맞게 이전에 되어서

인서트가 되어야하는데..

밑의 프로시저를 보면 제가 메모데이터 추가라고 주석을 달아놨는데..

칼럼안에 셀렉트쿼리를 추가해서 입력받은 년도가 2014년하반기이면

2014년상반기의 데이터가 조회되어서 인서트될 내용에 포함이 되도록..추가했는데..

저렇게 하면 예를들면 조회될 데이터 로우 첫번째의 메모데이터가 'TEST' 이면

계획생성된 모든 고객들의 메모데이터가 'TEST'로 나오네요. 전기의 메모데이터가 없으면

그냥 없는데로. 있으면 그 고객의 메모가 인서트가 되어야 하는데 말이죠..

매칭을 어떻게 시켜야하는지 모르겠어요.

"계획생성되는 고객들 = 그고객의 전기 메모데이터" 이렇게 말이죠. 일단 프로시저 밑에 첨부하겠습니다.

그리고 또 하나 질문이 있는데 메모데이터 검색하는 조건에 입력받은 년도, 반기의 전기의 데이터가 조회인데..

예를들면 입력값이 2014/2 이면 조회는 2014/1,

입력받은 값이 2015/1 이면 2014/2 이렇게요. 디코드문 써서 입력받은 반기 값이 1이면 2로, 년도는 그대로,

입력받은 반기 값이 2이면 1로 년도는 -1, 이런식으로 하면 될까요?

수정하다가 머리가 안돌아가서 이렇게 질문드립니다. 아시는분 답변 부탁드릴게요.ㅠㅠ 감사합니다. 답변기다릴게요~

---------------------계획생성 프로시저 샘플------------------

(

    P_YEAR          IN VARCHAR2 , -- 변수(년도), 값은 2014 가 들어갈 예정

    P_HF_YEAR      IN VARCHAR2 ,-- 변수(반기), 값은 2가 들어갈 예정

    P_TEST_AREA      IN VARCHAR2--변수(지역)

)                                 

AS      

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

계획생성 프로시저

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

V_SEQ       DECIMAL(28)    ;--  자동 채번

V_CNT NUMBER(3);            -- 카운트용

 

 BEGIN 

  

    SELECT NVL(TO_NUMBER(MAX(SUBSTR(ID_NUM,9,6))), 0)

    INTO V_SEQ

    FROM TESTDB

   WHERE ID_NUM LIKE TO_CHAR(SYSDATE,'YYYYMMDD')||'%';

 

--*******************************************************************

 

      INSERT INTO TESTDB

          (ID_NUM,

          ..................................................................

          TX_MEMO

          )

                 SELECT

                               TO_CHAR(SYSDATE,'YYYYMMDD') || TRIM(TO_CHAR(ROWNUM+V_SEQ,'000000'))

                               .................................................................

                              -- 메모데이터 추가

                               , (SELECT TX_MEMO FROM

                                                    (SELECT * FROM TESTDB

                                                    WHERE TX_MEMO IS NOT NULL

                                                    AND YY_INSP = '2014' AND HF_INSP = '1'

                                 --실제 조건은 P_YEAR = '2014', P_HF_YEAR = '2' 인경우

                                                       2014/1의 데이터가 검색될수 있는 조건.

                                                    ORDER BY ID_NUM DESC 

                                 --로우가 2개 이상일 때 ID가 최신인 데이터만 가져올 수 있도록

                                                    )

                              WHERE ROWNUM = '1')

                                -- 로우가 2개 이상일 때 ID가 최신인 데이터만 가져올 수 있도록

          FROM TABLE1 A, TABLE2 B, TABLE3 C...........

          WHERE 조건1,2,3,4,5.................

          .........................

          AND B.YEAR = P_YEAR

          AND B.HF_YEAR = HF_YEAR

          AND A.TEST_AREA = P_TEST_AREA

          AND A.NO_CUSTOMER NOT IN (SELECT NO_CUSTOMER  

                                                                       -- 이미 계획에 있는 고객들은 빠지도록.

                                                 FROM TESTDB

                                                 WHERE YEAR = P_YEAR

                                                 AND HF_YEAR = P_HF_YEAR

                                                 AND TEST_AREA = P_TEST_AREA);

     

 RETURN;

 

EXCEPTION

        WHEN OTHERS

        THEN

            RAISE_APPLICATION_ERROR (-20001, 'TEST' || SQLERRM);

END TEST;

/

--------------------- 프로시저 샘플 종료-------------------------

이 글에 대한 댓글이 총 2건 있습니다.
스칼라서브쿼리에 대한 이해부족이네요.
메인 쿼리의 컬럼이 서브쿼리의 조건으로 주어져야 합니다.
인위적으로 rownum 으로 1건을 걸러내는게 아닌...
정확하게 일치하는 조건으로 1건을 걸러내야죠.
마농(manon94)님이 2014-05-26 15:08에 작성한 댓글입니다.

 마농님 답변 감사합니다. 그러네요.. 어렵게 생각을 했네요..

제가 아직 개념이 잘 안잡혀서..ㅠ

간단하게 쿼리에 있는 고객번호랑

서브쿼리에서 매칭시키면 될껄 복잡하게 생각해서..

어쨌든 해결되었어요~

감사합니다.

도토리님이 2014-05-26 16:19에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40475윈도우 8.1 임포트 너무 느려요 ㅠ.ㅠ
앤드르미
2014-05-28
7140
404749i클라이언트로 서버 접속을 하고 있는데 상위버전 호환 질문..
양찬재
2014-05-28
7018
40473Oracle export / import 할때 ...
채미남
2014-05-27
6989
40472인서트 프로시저에서 특정칼럼 때문에 질문드립니다. [2]
도토리
2014-05-26
7957
40471숫자 or 문자 비교하여 같은 값이면 count 제외처리 [2]
정상기
2014-05-23
7307
40470VIEW에서 connect by 사용법
초보
2014-05-22
6762
40469오라클 SQL 또는 PL/SQL 질문입니다..몇일째 고생중.. [2]
월화수목금금금
2014-05-22
6812
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다