테이블이 FK로 묶여있을 때 상위테이블에서 데이터를 삭제하려고 하면 볼 수 있는 에러.
매칭된 컬럼을 보고 싶다면 아래의 쿼리를 날려주자.

SELECT PARENTCOLS.OWNER || '.' || PARENT.TABLE_NAME || '.' || PARENTCOLS.COLUMN_NAME || ' matches to ' || CHILDCOLS.OWNER || '.' || CHILD.TABLE_NAME || '.' || CHILDCOLS.COLUMN_NAME
  FROM ALL_CONS_COLUMNS CHILDCOLS, ALL_CONS_COLUMNS PARENTCOLS, ALL_CONSTRAINTS CHILD, ALL_CONSTRAINTS PARENT
 WHERE CHILDCOLS.OWNER = 'OWNER'
   AND CHILDCOLS.CONSTRAINT_NAME = 'SYS_CODE'
   AND CHILDCOLS.OWNER = CHILD.OWNER
   AND CHILDCOLS.CONSTRAINT_NAME = CHILD.CONSTRAINT_NAME
   AND CHILD.R_OWNER = PARENT.OWNER
   AND CHILD.R_CONSTRAINT_NAME = PARENT.CONSTRAINT_NAME
   AND PARENT.OWNER = PARENTCOLS.OWNER
   AND PARENT.CONSTRAINT_NAME = PARENTCOLS.CONSTRAINT_NAME
   AND CHILDCOLS.POSITION = PARENTCOLS.POSITION
ORDER BY CHILDCOLS.POSITION;



Posted by 좀모씨

Oracle 10g 버전으로 업그레이드 후, 토드의 8.X 버전에서 'IN' is not a valid integer value 에러가 뜹니다.

다행히 해결법은 있었군요.

 

버그의 원인은 오라클 패치로 인해 ALL_ARGUMENTS가 냉텅이 되어서 그런겁니다.


1) SYS 로 로그인 합니다.
2) 아래의 view를 생성합니다. (ALL_ARGUMENTS_TOAD)

CREATE OR REPLACE VIEW ALL_ARGUMENTS_TOAD
(OWNER, OBJECT_NAME, PACKAGE_NAME, OBJECT_ID, OVERLOAD,
ARGUMENT_NAME, POSITION, SEQUENCE, DATA_LEVEL,
DATA_TYPE, DEFAULT_VALUE, DEFAULT_LENGTH, IN_OUT, DATA_LENGTH,
DATA_PRECISION, DATA_SCALE, RADIX, CHARACTER_SET_NAME, TYPE_OWNER,
TYPE_NAME, TYPE_SUBNAME, TYPE_LINK, PLS_TYPE, CHAR_LENGTH,
CHAR_USED, SUBPROGRAM_ID)
AS
SELECT
u.name, /* OWNER */
NVL(a.PROCEDURE$,o.name), /* OBJECT_NAME */
DECODE(a.PROCEDURE$,NULL,NULL, o.name), /* PACKAGE_NAME */
o.obj#, /* OBJECT_ID */
DECODE(a.overload#,0,NULL,a.overload#), /* OVERLOAD */
a.argument, /* ARGUMENT_NAME */
a.position#, /* POSITION */
a.SEQUENCE#, /* SEQUENCE */
a.LEVEL#, /* DATA_LEVEL */
DECODE(a.TYPE#, /* DATA_TYPE */
0, NULL,
1, DECODE(a.charsetform, 2, 'NVARCHAR2', 'VARCHAR2'),
2, DECODE(a.scale, -127, 'FLOAT', 'NUMBER'),
3, 'NATIVE INTEGER',
8, 'LONG',
9, DECODE(a.charsetform, 2, 'NCHAR VARYING', 'VARCHAR'),
11, 'ROWID',
12, 'DATE',
23, 'RAW',
24, 'LONG RAW',
29, 'BINARY_INTEGER',
69, 'ROWID',
96, DECODE(a.charsetform, 2, 'NCHAR', 'CHAR'),
100, 'BINARY_FLOAT',
101, 'BINARY_DOUBLE',
102, 'REF CURSOR',
104, 'UROWID',
105, 'MLSLABEL',
106, 'MLSLABEL',
110, 'REF',
111, 'REF',
112, DECODE(a.charsetform, 2, 'NCLOB', 'CLOB'),
113, 'BLOB', 114, 'BFILE', 115, 'CFILE',
121, 'OBJECT',
122, 'TABLE',
123, 'VARRAY',
178, 'TIME',
179, 'TIME WITH TIME ZONE',
180, 'TIMESTAMP',
181, 'TIMESTAMP WITH TIME ZONE',
231, 'TIMESTAMP WITH LOCAL TIME ZONE',
182, 'INTERVAL YEAR TO MONTH',
183, 'INTERVAL DAY TO SECOND',
250, 'PL/SQL RECORD',
251, 'PL/SQL TABLE',
252, 'PL/SQL BOOLEAN',
'UNDEFINED'),
DEFAULT$, /* DEFAULT_VALUE */
deflength, /* DEFAULT_LENGTH */
DECODE(in_out,NULL,'IN',1,'OUT',2,'IN/OUT','Undefined'), /* IN_OUT */
LENGTH, /* DATA_LENGTH */
PRECISION#, /* DATA_PRECISION */
DECODE(a.TYPE#, 2, scale, 1, NULL, 96, NULL, scale), /* DATA_SCALE */
radix, /* RADIX */
DECODE(a.charsetform, 1, 'CHAR_CS', /* CHARACTER_SET_NAME */
2, 'NCHAR_CS',
3, NLS_CHARSET_NAME(a.charsetid),
4, 'ARG:'||a.charsetid),
a.type_owner, /* TYPE_OWNER */
a.type_name, /* TYPE_NAME */
a.type_subname, /* TYPE_SUBNAME */
a.type_linkname, /* TYPE_LINK */
a.pls_type, /* PLS_TYPE */
DECODE(a.TYPE#, 1, a.scale, 96, a.scale, 0), /* CHAR_LENGTH */
DECODE(a.TYPE#,
1, DECODE(bitand(a.properties, 128), 128, 'C', 'B'),
96, DECODE(bitand(a.properties, 128), 128, 'C', 'B'), 0), /* CHAR_USED */
a.PROCEDURE# /* SUBPROGRAM ID */
FROM obj$ o,argument$ a,USER$ u
WHERE o.obj# = a.obj#
AND o.owner# = u.USER#
AND (owner# = USERENV('SCHEMAID')
OR EXISTS
(SELECT NULL FROM v$enabledprivs WHERE priv_number IN (-144,-141))
OR o.obj# IN (SELECT obj# FROM sys.objauth$ WHERE Grantee# IN
(SELECT kzsrorol FROM x$kzsro) AND privilege# = 12))
/



출처 : http://www.nabble.com/RE:-10-G-database---IN-is-not-a-valid-integer-value-p3405244.html

Posted by 좀모씨
빙그레C님 댁에서...


1. trim

String.prototype.trim = function() {
    return this.replace(/(^\s+)|(\s+$)/g, '');
}


2. 입력된 문자열의 byte 수 체크

String.prototype.bytes = function() {
    var str = this;
    var len = 0;
    for (var i = 0; i < str.length; i++) {
        len += (str.charCodeAt(i) > 128) ? 2 : 1;
    }
    return len;
}


3. byte 수 만큼 문자열 자르기

String.prototype.cut = function(len) {
    var str = this;
    var s = 0;
    for (var i = 0; i < str.length; i++) {
        s += (str.charCodeAt(i) > 128) ? 2 : 1;
        if (s > len) {
          return str.substring(0,i);
        }      
    }
    return str;
}


* UTF-8은 한글 1자당 3Byte이므로, 3씩 증가시켜 주면 됨.
Posted by 좀모씨

1. JavaScript 문법 오류 체크해주는 플러그인




* Eclipse Plugin 에 관한 내용 모음

Posted by 좀모씨

처음 IT노가다를 시작할 때 unix를 만졌던 것이 아니라서 vi는 영 손에 익지를 않는다. 요즘도 Ultraedit에서 FTP로 연결 후에 편집하는 경우가 많은데, 그것도 영 귀찮은 과정이고, 또한 왠지 콘솔에서 직접 투닥투닥 하는 것이 더 간지나지 않는가? -ㅅ-

그래서 정리.

커서 이동

  • 위(k), 아래(j), 왼쪽(h), 오른쪽(l)
  • 한화면위(Ctrl-b), 한화면아래(ctrl-f), 반화면위(ctrl-u), 반화면아래(ctrl-d)
  • 한단어오른쪽이동(w), 한단어왼쪽이동(b)
  • 공백구분한단어오른쪽이동(W), 공백구분한단어왼쪽이동(B)
  • 줄맨앞이동(0), 줄맨끝이동($), 특정줄로이동(줄G)
  • 한문단뒤로이동(}), 한문단앞으로이동({)

삽입모드로 전환

  • 커서위치부터삽입(i), 커서위치다음글자부터삽입(I)
  • 커서아래줄처음부터삽입(o), 커서위줄처음부터삽입(O)
  • 현재문자다음부터삽입(a), 현재줄끝부터삽입(A)

삭제

  • 커서위치의한글자삭제(x), 커서줄삭제(dd), 커서위치한단어삭제(dw)

콜론(:) 명령

  • 저장(:w), 저장하지않고종료(:q!), 저장하고종료(:wq)
  • 다른화일읽기(:r 화일명), 줄번호나타내기(:set number), 줄번호없애기(:set nonumber)
  • 문서전체에서글자바꿈(:1,$ s/Old/New/g), 유닉스명령수행(:! 명령)

기타

  • 이전명령취소(u), 커서줄전체명령취소(U)
  • 대소문자변경(~), 아래로단어검색(/단어), 위로단어검색(?단어), 검색반복(n)
  • 화일정보나타내기(ctrl-g)

잘만 쓰면 어떤 에디터보다 강력하다는 vi. 라고는 하지만, 솔직히 gui쪽 에디터보다 월등하다고 못박기는 어렵지 않을까. 다만, 오래전부터 애용되었던 프로그램이고, 그것에 익숙한 사람들이 많으며, 아무나 건드리지 못하는 데에서 오는 왠지 모를 우월감도 개미콧구멍만큼은 작용하지 않을까..하는 생각을 해봅니다만.

Posted by 좀모씨


지금 관리하는 사이트를 만드신 분께서 서버 아이피니, 파일 저장 절대경로니...기타등등을 죄다 서블릿 안에 박아놔서 로컬에서 개발할 때 에로사항이 쫌 꽃피길래 만들어 봤다오.

server.properties 라는 파일에 설정을 하고.

Server_mode=DEV
Server_ip=http://xx.xx.xx.xx:xxxx
##Report_path=/upload/Report/
##Notice_path=/upload/Notice/
Report_path=C:\\webapp\\FileAttach\\Report\\
Notice_path=C:\\webapp\\FileAttach\\Notice\\


Constructor.java

public class Constructor {

 private java.util.Properties mProperties;

 private String Server_mode = "";
 private String Server_ip = "";
 private String Report_path = "";
 private String Notice_path = "";

 //properties 파일 이름
 private String cfg_file  = "server.properties";

 public String getServer() {  
  try {
   loadConfig(cfg_file);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return Server_ip;
 }

 public String getMode() {

  try {
   loadConfig(cfg_file);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return Server_mode;
 }
 
 public String getReportPath() {

  try {
   loadConfig(cfg_file);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return Report_path;
 }
 
 public String getNoticePath() {

  try {
   loadConfig(cfg_file);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return Notice_path;
 }

 private boolean loadConfig(String name) throws Exception {
  boolean rc = false;

  ClassLoader cl = getClass().getClassLoader();

  java.io.InputStream in;

  if (cl != null) {
   in = cl.getResourceAsStream(name);
  } else {
   in = ClassLoader.getSystemResourceAsStream(name);
  }
 
  // 만일 InputStream이 null이면 configuration 파일이 없다.
  if (in == null) {
   throw new Exception("configuration file " + name + " was not found.");
  } else {
   try {
    mProperties = new java.util.Properties();
    mProperties.load(in);

    Server_mode = consume(mProperties, "Server_mode");
    Server_ip = consume(mProperties, "Server_ip");
    Report_path = consume(mProperties, "Report_path");
    Notice_path = consume(mProperties, "Report_path");
    rc = true;
   } finally {
    if (in != null) {
     try {
      in.close();
     } catch (Exception ex) {
     }
    }
   }
  }
  return true;
 }

 private String consume(java.util.Properties p, String key) {
  String s = null;
  if ((p != null) && (key != null)) {
   s = p.getProperty(key);
   System.out.println("#### key : " + key);
   System.out.println("#### var : " + s);
   if (s != null) {
    p.remove(key);
   }
  }
  return s;
 }

}


요렇게 돌리면, 각 페이지에서 Constructor.getServer() 이런 식으로 불러다가 쓸 수 있지롱. 서버설정이 바뀌어도 server.properties 파일에서 변경하면 되니까 서버 리스타트 안해도 되고, 일관적인 관리가 가능하다는 말씀임.

※ 근데 버그가 하나 있음다. 찾아보세요~*

Posted by 좀모씨

. DAO에서 PreparedStatement를 사용하면 SQL의 보안에는 충실하지만 정작 디버깅시 variable을 알아먹을 수가 없어서 에로사항이 꽃피게 된다.

. 그렇다고 할당받은 변수를 그냥 소스상에 박아 넣고 로깅하게 되면 알아먹기는 편하지만 보안상 문제가 발생하고, 퍼포먼스도 떨어진다고 하는데...솔직히 잘은 모르겠다- _-;

. PreparedStatement를 로깅해주는 방법에는 몇가지가 있지만 ibm에서 제시한 LoggableStatement를 사용하는 방법이 가장 깐쫀하다.
( http://www.ibm.com/developerworks/java/library/j-loggable.html , [번역])



. 첨부된 class를 Library에 등록하고, 사용법은 다음과 같다.
PreparedStatement pstmt = null;
StringBuffer sql = new StringBuffer();
int fooVal = 99;
String barVal = "zommoc";

Connection conn = dataSource.getConnection();
sql.append(" Select foo, bar From foorbar Where foo < ? and bar = ? ");

pstmt = new LoggableStatement(conn, sql.toString());
pstmt.setInt(1, fooVal);
pstmt.setString(2, barVal);

ResultSet rset = pstmt.executeQuery();
// parse result ...


. 그리고 얘를 콘솔에 로깅할 때는 아래처럼 처리해 주면 된다.
try {
   //블라블라~
} catch (SQLException e) {
   //블라블라~
} finally {
   Exception e = new Exception();
   StackTraceElement trace = e.getStackTrace()[0];
   Debug.logWrite(trace.getClassName()+"."+trace.getMethodName(), ((LoggableStatement)pstmt).getQueryString(), true, false);
   ConnectionFactory.release(conn,pstmt,rset);
}

* Log찍어주는 Debug class는 싸제라서...그냥 System.out.println 해도 됨.

. 이밖에도 p6spy 라는 framework도 존재하는데, 얘는 좀 쓰기 구찮다. 그냥 이거 쓰자;

Posted by 좀모씨
http://티토아이디.tistory.com/login?requestURI=이동할페이지/&goDaum=false&loginid=메일주소&password=비밀번호알려줄것같냐

얘를 즐겨찾기 해두시면, 항상 티스토리에 로그인한 채로 시작할 수 있습니다.
단, 남들과 함께 쓰는 컴퓨터에서 이래 놓으면 난감무쌍하겠죠? -ㅅ-);

요즘 OZ로 자주 인터넷을 사용하는데...
OZ브라우저에 ID/PW 자동입력 기능이 있다고는 하지만, 저 페이지를 즐겨찾기 해두면 훨씬 더 편하겠군요. 오호호호-

아니 긍까...
이런걸 티토쪽에서 자동로그인 지원하면 좋잖아~ - _-;

귀찮게스리...



[추가]

http://티토아이디.tistory.com/login?loginid=메일주소&password=비번

이게...더 간단하네요- _-;
하긴...RequestURI이니, goDaum이니, Default 값을 정해놨겠지..
다만, 로그인 후 자기 블로그로 무조건 떨어진다는 점은 있지만...요걸로 써야따 으하하.

나만 모르고 있던거? ㅠ_ㅠ


'슬기로운생활 > UTIL/Tip' 카테고리의 다른 글

AnyClick, ClientRSCDetect.exe 삭제  (0) 2011.12.01
윈7 USB 부팅 만들기  (2) 2011.09.30
foobar2000 1.0 그리고 한글 문제  (9) 2010.01.22
ViGlance OneStep V1 - 작업표시줄 애드온  (2) 2009.12.17
Eclipse Plugins  (0) 2009.09.03
Posted by 좀모씨
이전버튼 1 2 3 이전버튼

블로그 이미지
Under Construction
좀모씨
Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함