PL/SQL] 업데이트시에 다른 테이블의 키값을 가져와서 넣으려하는데 .. 어떻게 해야할지 .. 0 5 1,347

by 날아라갑을 [PL/SQL] update문 [2018.01.25 11:22:24]


X_SQL := '' ;
      X_SQL := X_SQL || ' UPDATE A_MASTER_TB A ' || CHR(13) ;
      X_SQL := X_SQL || ' SET  A.UPT_SEQ = ' || P_LOGIN_USER_SEQ  || CHR(13) ;
      X_SQL := X_SQL || '       , A.UPT_DT = SYSDATE ' || CHR(13) ;
      X_SQL := X_SQL || '       , A.FINE_YN = ''10250001'' ' || CHR(13) ;   --완료값 삽입
      X_SQL := X_SQL || '       , A.PRE_BILL_SEQ = (SELECT * FROM B_MASTER_TB B WHERE 1=1 AND B.S_DATE = ''' || S_DATE || ''' AND B.E_DATE = ''' || E_DATE || ''' AND B.FINE_YN = '10250001' ) ' || CHR(13) ;   

 

UPDATE시에 해당 데이터를 가져와서 업데이트 넣어주려하는데 .. 구문 오류가 발생했다고 나오네요..

끝에 AND B.FINE_YN = '10250001'에서 문제가 생기는것 같은데 .. 직접 값을 못넣는건가요 ... ?

by 마농 [2018.01.25 11:35:07]

1. 따옴표 처리 확인하세요
  - 5라인의 A.FINE_YN = ''10250001'' 과
  - 7라인의 AND B.FINE_YN = '10250001' 을 비교해 보세요.
2. 값을 가져와서 처리하는 거라면?
  - P_LOGIN_USER_SEQ 처럼 변수를 써야 하는 것 아닌지요?
3. 기타 사항
  - S_DATE 와 E_DATE 는 변수인가요?
  - 변수명은 컬럼명과 구별되도록 다르게 해주는게 좋습니다. (예 : v_s_date)


by 날아라갑을 [2018.01.25 14:47:17]

P_LOGIN_USER_SEQ처럼 변수를 하나 만들어주면 ..

그 변수에 가져올값은 어디에 어떻게 만들어서 변수를 들고있어야 할까요  ...


by 우리집아찌 [2018.01.25 13:18:09]

dbms_output.put_line(X_SQL );   로 출력해보세요


by 마농 [2018.01.25 15:11:48]

10250001 이 값이 다른데서 가져오는 값이라면? 변수를 쓰는게 맞다고 생각했구요.
그냥 고정으로 정해진 값이라면 상수를 써야죠. 상수 쓴다면? 따옴표 잘 사용했는지 확인하세요.
따옴표 안에서 사용되는 따옴표 두개연속은 따옴표 한개를 의미합니다.
즉, 따옴표 한개를 표현하려면 따옴표를 두개 연속 사용해야 합니다.
변수사용법은 소스내 다른 변수 어디서 어떻게 사용하는지 참고하시면 됩니다.


by 그로밋 [2018.01.25 15:39:10]

참고로, PL/SQL예서 복잡한 다이내믹 쿼리를 나타내려면, 쿼리를 작은 따옴표로 감싸 주는것 보다, q'[ ]'로 감싸 주는것이 편합니다.  여기서 q'[ ]' 로 쿼리를 감싸 주는 대신에, 상황에 따라, q'< >', q'( ),  'q'{ }', 혹은 q'! !' 를 이용할 수 있습니다.  이렇게 하면, 아래의 예처럼 input값을 표현하는 것도 간단해지고  CHR(13)을 더해줄 필요도 없습니다.

X_SQL := q'[
UPDATE A_MASTER_TB A
  SET A.UPT_SEQ = ]' || P_LOGIN_USER_SEQ || q'[,
      A.UPT_DT = SYSDATE,
      A.FINE_YN = '10250001',
      A.PRE_BILL_SEQ = 
        (SELECT 컬럼이름
           FROM B_MASTER_TB B
           WHERE 1 = 1
             AND B.S_DATE = ']' || S_DATE || q'['
             AND B.E_DATE = ']' || E_DATE || q'['
             AND B.FINE_YN = '10250001')
]';

 

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