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 41278 게시물 읽기
No. 41278
start with 구문 Update 사용 문의
작성자
박재덕(jdpark)
작성일
2016-11-08 12:47ⓒ
2016-11-08 12:52ⓜ
조회수
7,469

1. start with b.deptcode = 'AA' 작업하면 Update 되는데

a.n_busecd 처럼 칼럼명을 넣으면 오류발생.

 

update msp_destination_test a

set a.n_busename = (

select aa from

( select b.up_deptname aa from tobe_dept_code b

start with b.deptcode = 'AA' -- a.n_busecd

connect by b.deptcode = prior b.up_deptcode

and b.lvl = '5'

ORDER BY LEVEL DESC ) b

where rownum = 1)

 

 

2. 위 문제를 해결하려고 PROCEDURE 작성했는데

tdept PLS-00049: bad bind variable 오류 발생합니다.

고수님의 도움 부탁드립니다.

 

Start With 의 문장에 제약이 있는 것인지, 구문 오류인지 도움 부탁드립니다.

 

 

CREATE OR REPLACE procedure KOSMOS_OCS.PROC_TODEPT_AA

IS

tdept VARCHAR2(20);

 

CURSOR C1

IS

SELECT n_busecd

FROM destination_test

where n_busecd is not null;

 

BEGIN

 

OPEN C1;

 

LOOP

 

FETCH C1 into tdept;

EXIT WHEN C1%NOTFOUND;

 

dbms_output.put_line(tdept); -- 정상으로 나옴.

 

update msp_destination_test a

set a.n_busename = ( select aa from

( select b.up_deptname aa from tobe_dept_code b

start with TRIM(b.deptcode) = TRIM(:tdept) -- ERROR

connect by b.deptcode = prior b.up_deptcode

and b.lvl = '5'

ORDER BY LEVEL DESC ) b

where rownum = 1)

where A.N_BUSECD is not null ;

 

END LOOP;

 

CLOSE C1;

 

COMMIT;

 

END;

 

 

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

1. 첫번째 오류는
  - 서브쿼리에 메인컬럼 사용은 1단계 아래 까지만 사용할 수 있습니다.
  - 두단계 아래 서브쿼리에서는 메인컬럼을 인지하지 못합니다.
2. 두번째 오류는
  - SQL 에서 바인드변수 사용시 콜론(:)이 사용됩니다.
  - PL/SQL 에서는 콜론(:) 없이 변수명 그대로 사용합니다.
3. 기타.
  - 계층쿼리가 이상하네요.
  - 어떤 의도로 작성된 쿼리인지 궁금하네요.
  - 정확한 의도를 파악하면 다른 형태로 개선이 가능할 듯 합니다.

마농(manon94)님이 2016-11-08 13:21에 작성한 댓글입니다.

두단계 아래 서브쿼리를 사용한 이유는

where rownum = 1)

 

2개 이상의 Row 가 나오기 때문입니다.

 

 

**

msp_destinaiton_test table 의 n_busedept 를 이용하여

tobe_dept_code table 에 있는 상위 부서명을 수정하기 위함입니다.

 

 

박재덕(jdpark)님이 2016-11-08 13:29에 작성한 댓글입니다.
이 댓글은 2016-11-08 13:35에 마지막으로 수정되었습니다.

의도가 상위 부서명을 가져오고자 함인가요?
이런 포괄적인 표현은 도움이 안됩니다.
구체적인 설명이 필요합니다.
 - 최상위 부서를 가져오고자 함인가요?
 - 직상위 부서를 가져오고자 함인가요?
 - and b.lvl = '5' 조건이 사용된 이유는 뭔가요?


계층 테이블 구조는 보통 다음과 같이 구성됩니다.
  - 코드, 코드명, 상위코드
  - 위에 사용하신 컬럼명이 "상위코드명" 인 듯 한데요?
  - "코드명" 이 아닌 "상위코드명" 도 존재하나요?
  - "상위코드명" 을 가져오는 이유는?


최종적으로 설명이 어려우시면
  - 실제 저장된 자료를 예로 들어 주시면 좋습니다.

마농(manon94)님이 2016-11-08 13:49에 작성한 댓글입니다.
이 댓글은 2016-11-08 13:50에 마지막으로 수정되었습니다.

3102000 AA 3100000 한국 4

3102010 중구 3102000 AA 5

3102011 A1동 3102010 중구 6

3102014 B2동 3102010 중구 6

3102094 B2동X 3102014 B2동 7

3102021 건물1 3102000 AA 5

3102022 건물2 3102000 AA 5

3102023 건물3 3102000 AA 5

3100000 한국 3000000 세계 3

3000000 세계 1000000 전체 2

3102000 AA 3100000 세계 4

1000000 전체 1

 

편집한 tobe_dept_code table 내용입니다.

 

직 상위 부서입니다.

 

Code 기준으로 보시는 것이 좋겠습니다.

박재덕(jdpark)님이 2016-11-08 15:46에 작성한 댓글입니다.
이 댓글은 2016-11-08 18:09에 마지막으로 수정되었습니다.

직상위 부서의 부서명을 가져오는거라면?
  - 위 테이블 구조(up_deptname 가 포함된 구조)에서는 계층쿼리가 필요 없겠는데요?


UPDATE msp_destination_test a
   SET a.n_busename = (SELECT up_deptname
                         FROM tobe_dept_code
                        WHERE deptcode = a.n_busecd
                       )
 WHERE a.n_busecd IS NOT NULL
   AND a.n_busename IS NULL
;

마농(manon94)님이 2016-11-08 16:10에 작성한 댓글입니다.

7 Level 계층 편집이 빠졌네요.

 

현재 6 Level 이 평균적인 Data 입니다만

 

7 Level 이 존재하는 경우 단순 Update 로는 안됩니다.

 

도움 주심에 감사합니다.

박재덕(jdpark)님이 2016-11-08 16:22에 작성한 댓글입니다.
이 댓글은 2016-11-08 18:08에 마지막으로 수정되었습니다.

레벨 상관 없이 직상위 가져오는 쿼리 알려드린 건데요?
혹시 원하시는게 직상위가 아니라 5레벨의 이름을 원하시는 건가요?


UPDATE msp_destination_test a
   SET a.n_busename = (SELECT deptname
                         FROM tobe_dept_code b
                        WHERE lvl = 5
                        START WITH deptcode = a.n_busecd
                        CONNECT BY deptcode = PRIOR up_deptcode
                          AND lvl >= 5
                       )
 WHERE a.n_busecd IS NOT NULL
   AND a.n_busename IS NULL
;

마농(manon94)님이 2016-11-09 17:27에 작성한 댓글입니다.

마농님 감사 합니다. ^^

 

 

박재덕(jdpark)님이 2016-11-09 20:10에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41281특정컬럼 안에 있는 데이터 변환 [2]
워즈
2016-11-10
5991
41280마농님 도와주세요 프로시져에서 막히네요 ㅠㅠ loop관련 도움 주세요 ㅠㅠ [1]
최종욱
2016-11-09
6094
41279마이그래이션(?)관련 질문입니다.
서범석
2016-11-08
5679
41278start with 구문 Update 사용 문의 [8]
박재덕
2016-11-08
7469
41277질문 다시 올립니다. [5]
최종욱
2016-11-04
6361
41276정렬 관련 문의 [1]
또하루
2016-11-03
6035
41275누적 쿼리. [2]
최종욱
2016-11-03
6391
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다