'나만의 작업/DataBase'에 해당되는 글 14건
- [CouchDB] Apache CouchDB 0.10.0 이 나왔답니다. (2) 2009/10/14
- [CouchDB] HTTP view API 2009/09/29
- [CouchDB] HTTP Document API 2009/07/14
- [CouchDB] Compaction 2009/07/13
- [CouchDB] HTTP database API (2) 2009/07/09
- [CouchDB] API Cheatsheet 2009/07/09
- [CouchDB] 초간단 Mac에서 CouchDB 실행하기 2009/07/07
- [CouchDB] 1. CouchDB가 뭐지? (2) 2009/07/07
- [오라클] 초성검색 (2) 2009/04/28
- 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) 2009/04/22
- Oracle instant client 설치(Mac OSX, Windows) 2009/01/07
- JAVA DB - Derby (4) 2007/05/12
- [Oracle] Introduction to Oracle 9i : SQL (2) 2007/02/11
- [Oracle] sql Vi 편집기 (1) 2007/02/06
[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.
Posted at 2009/10/14 11:38// Posted in 나만의 작업/DataBase- Added modular configuration file directories.
- Miscellaneous improvements to build, system integration, and portability.
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] Apache CouchDB 0.10.0 이 나왔답니다. (2) | 2009/10/14 |
|---|---|
| [CouchDB] HTTP view API (0) | 2009/09/29 |
| [CouchDB] HTTP Document API (0) | 2009/07/14 |
| [CouchDB] Compaction (0) | 2009/07/13 |
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
[CouchDB] HTTP view API
Posted at 2009/09/29 09:50// Posted in 나만의 작업/DataBaseview(뷰)는 Couch document를 쿼리하거나 리포팅할때 사용되는 주요툴이다.
뷰는 자바스크립트 function으로 정의된다.
function(doc) {
emit(null, doc);
}
Creating Views
permanent view를 만들기 위해 function은 특별한 design document에 먼저 저장되어 있어야 한다.
design document의 id는 _design으로 시작하고 view attribute는 map과 optional하게 reduce를 갖는다.
design document의 모든 view는 index되어 있다.
design document
{
"_id":"_design/company",
"_rev":"12345",
"language": "javascript",
"views":
{
"all": {
"map": "function(doc) { if (doc.Type == 'customer') emit(null, doc) }"
},
"by_lastname": {
"map": "function(doc) { if (doc.Type == 'customer') emit(doc.LastName, doc) }"
},
"total_purchases": {
"map": "function(doc) { if (doc.Type == 'purchase') emit(doc.Customer, doc.Amount) }",
"reduce": "function(keys, values) { return sum(values) }"
}
}
}
Altering/Changing Views
하나의 뷰나 여러개의 뷰들을 바구기 위해선 document바꿀때랑 똑같다.
Access/Query
database에 document가 한번 저장되어있으면 모든 view는 이 URL로 반환받을 수 있다.
http://localhost:5984/database/_design/company/_view/all
요청은 이렇게..
GET /some_database/_design/company/_view/all HTTP/1.0
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
응답은 다음과 같다.
HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Length: 318
Connection: close
{
"total_rows": 3,
"offset": 0,
"rows": [{
"id":"64ACF01B05F53ACFEC48C062A5D01D89",
"key": null,
"value": {
"LastName":"Katz",
"FirstName":"Damien",
"Address":"2407 Sawyer drive, Charlotte NC",
"Phone":012555754211
}
}, {
"id":"5D01D8964ACF01B05F53ACFEC48C062A",
"key": null,
"value": {
"LastName":"Kerr",
"FirstName":"Wayne",
"Address":"123 Fake st., such and such",
"Phone":88721320939
}
}, {
"id":"EC48C062A5D01D8964ACF01B05F53ACF",
"key": null,
"value":
{
"LastName":"McCracken",
"FirstName":"Phil",
"Address":"1234 Fake st., such and such",
"Phone":7766552342
}
}
]
}
Temporary Views
한번 쿼리 날리고 말것(CouchDB database에 view를 저장하고 싶지않으면) _temp_view라는 특별한 view를 통해 할 수 있다.
Temporary View는 개발중에만 사용하는 것이 좋다.
요청
POST /some_database/_temp_view HTTP/1.0
Content-Length: 48
Date: Mon, 10 Sep 2007 17:11:10 +0200
Content-Type: application/json
{
"map" : "function(doc) { if (doc.foo=='bar') { emit(null, doc.foo); } }"
}
응답
{
"total_rows": 1,
"offset": 0,
"rows": [{
"id": "AE1AD84316B903AD46EF396CAFE8E50F",
"key": null,
"foo": "bar"
}
]
}
NOTE : CouchDB 0.9.0에선 _temp_view에 POST 요청시 Content-Type: application/json를 써줘야한다.
Querying Options
아래와 같은 URL query arguments가 허용된다.
* GET
key=keyvalue
startkey=keyvalue
startkey_docid=docid
endkey=keyvalue
endkey_docid=docid
limit=max rows to return This used to be called "count" previous to Trunk SVN r731159
stale=ok
descending=true
skip=number of rows to skip
group=true Version 0.8.0 and forward
group_level=int
reduce=false Trunk only (0.9)
include_docs=true Trunk only (0.9)
* POST
{"keys": ["key1", "key2", ...]} Trunk only (0.9)
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] Apache CouchDB 0.10.0 이 나왔답니다. (2) | 2009/10/14 |
|---|---|
| [CouchDB] HTTP view API (0) | 2009/09/29 |
| [CouchDB] HTTP Document API (0) | 2009/07/14 |
| [CouchDB] Compaction (0) | 2009/07/13 |
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
[CouchDB] HTTP Document API
Posted at 2009/07/14 10:02// Posted in 나만의 작업/DataBase제가 하고싶은걸 실습한 것이기 때문에 삭제된 내용도 있습니다.
Naming/Addressing
CouchDB에 저장된 Document들은 DocID를 가진다. DocID는 유니크한 아이디. 두개의 document는 같은 database안에 같은 identifier를 가질 수 없다.
"test"라는 이름의 database안의 some_doc_id, another_doc_id, BA1F48C5418E4E68E5183D5BD1F06476 이름의 document가 있다.
http://localhost:5984/test/some_doc_id
http://localhost:5984/test/another_doc_id
http://localhost:5984/test/BA1F48C5418E4E68E5183D5BD1F06476
JSON
CouchDB document는 간단한 JSON object이다.
{
"_id":"some_doc_id",
"_rev":"D1C946B7",
"Subject":"I like Plankton",
"Author":"Rusty",
"PostedDate":"2006-08-15T17:30:12-04:00",
"Tags":["plankton", "baseball", "decisions"],
"Body":"I decided today that I don't like baseball. I like plankton."
}
Working With Documents Over HTTP
document생성
buri라는 database안의 document들의 리스트를 얻을려면,
~]curl -i http://localhost:5984/buri/_all_docs
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Server: CouchDB/0.9.0 (Erlang OTP/R13B)
Etag: "EUBRVUD02OXJJT4QD3O565AWW"
Date: Sat, 04 Jul 2009 12:01:04 GMT
Content-Type: text/plain;charset=utf-8
Cache-Control: must-revalidate
{"total_rows":3,"offset":0,"rows":[
{"id":"038dac2f6d16d32cfa4f0beedd1b970f","key":"038dac2f6d16d32cfa4f0beedd1b970f","value":{"rev":"1-752793712"}},
{"id":"_design/log","key":"_design/log","value":{"rev":"1-1517763105"}},
{"id":"test_doc","key":"test_doc","value":{"rev":"1-2073410021"}}
]}
하나의 document의 정보를 알고 싶으면(기본필드(_id, _rev)외에 따로 추가한 필드가 없어서 응답받은 JSON은 이렇다.
~]curl http://localhost:5984/buri/test_doc
{"_id":"test_doc","_rev":"1-2073410021"}
Accessing Previous Revisions
특정한 revision의 document를 가져오고 싶으면,
~]curl http://localhost:5984/buri/test_doc?rev=1-2073410021
{"_id":"test_doc","_rev":"1-2073410021"}
document의 가능한 revision을 찾기 위해선,
~]curl http://localhost:5984/buri/test_doc?revs=true
{"_id":"test_doc","_rev":"1-2073410021","_revisions":{"start":1,"ids":["2073410021"]}}
document의 현재 revision을 반환하지만, _revisions라는 필드는 이용가능한 revision ID를 리스트를 갖는다.
_revisions 결과가 하나라서 확인하여 좀 허무하다면,
revision을 증가시키기위해, document에 필드를 추가한 후 다시 _revisions를 확인하기 위해 요청해보면,
~]curl http://localhost:5984/buri/test_doc?revs=true
{"_id":"test_doc","_rev":"2-3544093946","test":"test field","_revisions":{"start":2,"ids":["3544093946","2073410021"]}}
_rev는 현재 revision을 반환하고, _revisions는 revision의 history ids를 가지고 있다.
이용가능한 document revision에 대해 좀 더 많은 정보를 얻고 싶으면, revs_info 파라미터를 이용하면 된다.
JSON 결과는 _revs_info 프로퍼티를 포함한 객체의 배열을 리턴한다.
{
"_revs_info": [
{"rev": "123456", "status": "disk"},
{"rev": "234567", "status": "missing"},
{"rev": "345678", "status": "deleted"},
]
}
PUT
새로운 document를 생성하기 위해선, POST나 PUT operation을 이용하면 된다.
PUT은 document를 생성/수정할 수 있다.
이미 존재하는 document를 수정하기 위해선 JSON body에 _rev 프로퍼티를 포함하고 있어야 한다.
그래야, CouchDB가 edit할지를 안다. database에 document의 현재 저장된 revision이 맞지 않으면, 409 conflict error를 리턴한다.
만약 revision 번호가 database에 있는 값과 매치하면 새로 generated된 revision 번호를 client에 리턴한다.
~]curl -X PUT http://localhost:5984/buri/test_doc -d '{"_id":"test_doc","_rev":"2-3544093946","test":"update field"}'
{"ok":true,"id":"test_doc","rev":"3-2553359885"}
POST
POST는 서버에 generated된 DocID를 생성하기 위해 사용된다. PUT method대신에 사용되기도 하는데 가능한한 POST를 피하는 걸 추천.
proxy나 다른 네트워크가 종종 POST 요청을 재전송해 document 생성 중복요청을 하므로...
DELETE
~]curl -i -X DELETE http://localhost:5984/buri/test_doc?rev=3-2553359885
HTTP/1.1 200 OK
Server: CouchDB/0.9.0 (Erlang OTP/R13B)
Etag: "4-386883723"
Date: Sat, 04 Jul 2009 12:49:12 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 48
Cache-Control: must-revalidate
{"ok":true,"id":"test_doc","rev":"4-386883723"}
All Documents
database의 모든 document의 리스트를 얻기위해 _all_docs URI를 이용
~]curl http://localhost:5984/buri/_all_docs 이런식으로
wiki에 나와있는 예제로 보면~
GET somedatabase/_all_docs HTTP/1.0
HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close
{
"total_rows": 3, "offset": 0, "rows": [
{"id": "doc1", "key": "doc1", "value": {"rev": "4324BB"}},
{"id": "doc2", "key": "doc2", "value": {"rev":"2441HF"}},
{"id": "doc3", "key": "doc3", "value": {"rev":"74EC24"}}
]
}
revision ID와 DocID에 정렬로 모든 document의 리스트를 보여준다.
query argument에 descending=true 를 보내면 정렬이 descending으로 결과를 리턴한다.
~]curl http://localhost:5984/buri/_all_docs?descending=true 이런식으로
HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close
{
"total_rows": 3, "offset": 0, "rows": [
{"id": "doc3", "key": "doc3", "value": {"_rev":"74EC24"}}
{"id": "doc2", "key": "doc2", "value": {"_rev":"2441HF"}},
{"id": "doc1", "key": "doc1", "value": {"_rev": "4324BB"}},
]
}
query string 파라미터를 startkey, endkey와 limit을 주면 결과를 제한할 수 있다.
~]curl http://localhost:5984/buri/_all_docs?startkey="doc2"&limit=2 이런식으로 보내면
GET somedatabase/_all_docs?startkey="doc2"&limit=2 HTTP/1.0
HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close
{
"total_rows": 3, "offset": 1, "rows": [
{"id": "doc2", "key": "doc2", "value": {"_rev":"2441HF"}},
{"id": "doc3", "key": "doc3", "value": {"_rev":"74EC24"}}
]
}
doc2 부터 두개의 값을 리턴받을 수 있다.
~]curl http://localhost:5984/buri/_all_docs?startkey="doc2"&endkey="doc3"
GET somedatabase/_all_docs?startkey="doc2"&endkey="doc3" HTTP/1.0
doc2와 doc3사이에 포함된 값을 리턴한다.
GET somedatabase/_all_docs?startkey="doc2"&limit=2&descending=true HTTP/1.0
HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Type: application/json
Connection: close
{
"total_rows": 3, "offset": 1, "rows": [
{"id": "doc3", "key": "doc3", "value": {"_rev":"74EC24"}}
{"id": "doc2", "key": "doc2", "value": {"_rev":"2441HF"}},
]
}
all_docs_by_seq
update됐거나, delete된 모든 document를 볼 수 있다.
~]curl http://localhost:5984/buri/_all_docs_by_seq
{"total_rows":3,"offset":0,"rows":[
{"id":"038dac2f6d16d32cfa4f0beedd1b970f","key":2,"value":{"rev":"1-752793712"}},
{"id":"a52617f0a61a11fa894a2ce6f62e3a7c","key":3,"value":{"rev":"2-695380571","deleted":true}},
{"id":"_design/log","key":5,"value":{"rev":"1-1517763105"}},
{"id":"test","key":6,"value":{"rev":"2-1465437068","deleted":true}},
{"id":"test_doc","key":10,"value":{"rev":"4-386883723","deleted":true}},
{"id":"test2_doc","key":11,"value":{"rev":"1-1479752545"}}
]}
Attachments
Document는 email과 값은 첨부파일을 가지고 있을 수 있다. 첨부파일을 사용하는 두가지 방법이 있는데 하나는 document에 인라인으로 기술하는 방법.
두번째 방법은 첨부파일을 위한 REST API을 이용하는 방법이 있다.
Inline Attachments
생성시 document의 _attachments attribute를 이용한다.
JSON 구조는 name, content_type, base64로 인코드된 첨부파일의 데이터를 가진다.
document가 리턴될때 첨부파일의 실제 데이터는 포함하지 않고 metadata만 반환된다. 실제 데이터는 따로 URI로 분라되어 fetch되어 있다.
document 요청시 첨부파일을 접근해야할때는 query parameter에 ?attachments=true를 포함해서 보낸다.
첨부파일이 있는 document 생성
{
"_id":"attachment_doc",
"_attachments":
{
"foo.txt":
{
"content_type":"text\/plain",
"data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
}
}
}
document를 요청하면,
GET /database/attachment_doc
이렇게 응답을 얻는다.
{
"_id":"attachment_doc",
"_rev":1589456116,
"_attachments":
{
"foo.txt":
{
"stub":true,
"content_type":"text\/plain",
"length":29
}
}
}
첨부파일을 요청하면
GET /database/attachment_doc/foo.txt
foo.txt파일의 내용인
This is a base64 encoded text
자동적으로 디코드되서 리턴된다.
Multiple Attachments
{
"_id":"attachment_doc",
"_attachments":
{
"foo.txt":
{
"content_type":"text\/plain",
"data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
},
"bar.txt":
{
"content_type":"text\/plain",
"data": "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ="
}
}
}
Standalone Attachments
CouchDB 0.9버젼에 추가되었다. 그 전 버젼에선 이용할 수 없다.
Content-Type 헤더를 이용하여 MIME type을 이용한다.
요청은 이렇게..
PUT somedatabase/document/attachment?rev=123 HTTP/1.0
Content-Length: 245
Content-Type: image/jpeg
<JPEG data>
응답은 이렇게 온다.
{"ok": true, "id": "document", "rev": "765B7D1C"}
첨부파일을 바꿀땐(수정)
PUT somedatabase/document/attachment?rev=765B7D1C HTTP/1.0
Content-Length: 245
Content-Type: image/jpeg
<JPEG data>
첨부파일을 삭제
DELETE somedatabase/document/attachment?rev=765B7D1C HTTP/1.0
ETags/Caching
CouchDB는 document 요청을 위해 ETag Header를 보낸다.
GET 요청의 예
GET /database/123182719287
응답
cache-control: no-cache,
pragma: no-cache
expires: Tue, 13 Nov 2007 23:09:50 GMT
transfer-encoding: chunked
content-type: text/plain;charset=utf-8
etag: "615790463"
POST 요청도 새롭게 추가되거나 document가 업데이트 하기 위해 ETag header를 리턴한다.
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] Apache CouchDB 0.10.0 이 나왔답니다. (2) | 2009/10/14 |
|---|---|
| [CouchDB] HTTP view API (0) | 2009/09/29 |
| [CouchDB] HTTP Document API (0) | 2009/07/14 |
| [CouchDB] Compaction (0) | 2009/07/13 |
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
[CouchDB] Compaction
Posted at 2009/07/13 13:54// Posted in 나만의 작업/DataBaseCompaction
Compaction은 database파일을 다시 쓰는 것.
outdated document revision을 제거하고 document를 삭제한다.
~]curl http://localhost:5984/buri ('buri'라는 이름의 DB의 간략한 정보를 볼 수 있다.)
{"db_name":"buri","doc_count":2,"doc_del_count":2,"update_seq":6,"purge_seq":0,"compact_running":false,
"disk_size":16361,"instance_start_time":"1246416252648676"}
~]curl -X POST http://localhost:5984/buri/_compact (compactio수행)
{"ok":true}
~]curl http://localhost:5984/buri (DB정보 확인)
{"db_name":"buri","doc_count":2,"doc_del_count":2,"update_seq":6,"purge_seq":0,"compact_running":false,
"disk_size":14807,"instance_start_time":"1246707347739253"}
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] Apache CouchDB 0.10.0 이 나왔답니다. (2) | 2009/10/14 |
|---|---|
| [CouchDB] HTTP view API (0) | 2009/09/29 |
| [CouchDB] HTTP Document API (0) | 2009/07/14 |
| [CouchDB] Compaction (0) | 2009/07/13 |
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
[CouchDB] HTTP database API
Posted at 2009/07/09 18:38// Posted in 나만의 작업/DataBase실행은 curl을 통해서 주로 하였습니다.
Naming and Addressing
database 이름은 모두 소문자 a-z, 숫자 0-9, _$()+-/ 문자로 이뤄져야 하고 slash(/)로 끝나야한다.
http://couchserver/databasename/
http://couchserver/another/databasename/
http://couchserver/another/database_name(1)/
주의! 대문자는 database 이름에 포함되어서는 안된다.
http://couchserver/DBNAME/ (invalid)
http://couchserver/DatabaseName/ (invalid)
http://couchserver/databaseName/ (invalid)
URL에서 DB이름에 slash(/)를 넣기 위해선 escape 처리를 해야한다.
DB이름이 "his/her" 이면 url을 이렇게 써서 보내야 한다.
http://localhost:5984/his%2Fher
List Databases
CouchDB server에 있는 모든 database들의 리스트 조회 /_all_dbs
~] curl http://localhost:5984/_all_dbs
HTTP/1.1 200 OK
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
Content-Length: 37
Content-Type: application/json
Connection: close
["somedatabase", "anotherdatabase"]
PUT (Create New Database)
위에 slash있는 Database이름을 만들어 보면
~]curl -X PUT http://localhost:5984/buri/test/
{"error":"invalid_json","reason":"undefined"}
escape처리해서 보내야 하므로~
~]curl -i -X PUT http://localhost:5984/buri%2Ftest/
HTTP/1.1 201 Created
Server: CouchDB/0.9.0 (Erlang OTP/R13B)
Date: Sat, 04 Jul 2009 10:56:20 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 12
Cache-Control: must-revalidate
{"ok":true}
이렇게 PUT 메소드를 실행하여 새로운 database를 만들었다!
성공하면 201 이미 존재한다면 412 HTTP status를 응답받는다.
DELETE
database를 지우고 싶으면 DELETE method를 이용하면 된다.
~]curl -X DELETE http://localhost:5984/buri%2Ftest
{"ok":true}
성공하면 200, 존재하지 않는다면 404 error HTTP status를 응답받는다.
Database Information
~]curl http://localhost:5984/buri
{"db_name":"buri","doc_count":2,"doc_del_count":2,"update_seq":6,"purge_seq":0,"compact_running":false,
"disk_size":16361,"instance_start_time":"1246416252648676"}
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] Apache CouchDB 0.10.0 이 나왔답니다. (2) | 2009/10/14 |
|---|---|
| [CouchDB] HTTP view API (0) | 2009/09/29 |
| [CouchDB] HTTP Document API (0) | 2009/07/14 |
| [CouchDB] Compaction (0) | 2009/07/13 |
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
-
[NC]...YellOw2009/07/12 02:30 [Edit/Del] [Reply]늘~ 열심히 하고 있네요. 보기 좋네요.
지금 비가 제법 내리고 있는거 같더라구여. 덕분에 차분한 밤을 보내고 있습니다 ^.~-
2009/07/17 11:49 [Edit/Del]늘 말씀드리는 거지만...속고 계신거에요...ㅋㅋㅋ
주말내내 비가 정말 많이 내렸던 듯..
덕분에 저도 밤에 차분히 보냈답니다..ㅋㅋ
-
[CouchDB] API Cheatsheet
Posted at 2009/07/09 18:30// Posted in 나만의 작업/DataBase2009년 7월 현재 0.9.0버젼의 CouchDB 공식 wiki에 작성되어 있는 API Cheatsheet를 옮겨 적어놓습니다.
CouchDB Server Level Requests
info : GET /
all_dbs : GET /_all_dbs
config : GET /_config
stats : GET /_stats
UUIDs : GET /_uuids (takes a count parameter)
replicate : POST /_replicate (see Replication) <-http://wiki.apache.org/couchdb/Replication
source에서 destination으로 복제하고 싶을때
CouchDB Database Level Requests
compact : POST /db/_compact
create : PUT /db
drop : DELETE /db
info : GET /db
all_docs : GET /db/_all_docs
open_doc : GET /db/doc_id
save_doc (CREATE) : POST /db
save_doc (UPDATE) : PUT /db/doc_id
remove_doc : DELETE /db/doc_id
bulk_docs : POST /db/_bulk_docs
query (aka temporary view) : POST /db/_temp_view
view
CouchDB 0.9.0 이전 버젼에서는
GET /db/_view/designname/viewname
CouchDB 0.9.0 이후 버젼에서는
GET /db/_design/designname/_view/viewname
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] HTTP view API (0) | 2009/09/29 |
|---|---|
| [CouchDB] HTTP Document API (0) | 2009/07/14 |
| [CouchDB] Compaction (0) | 2009/07/13 |
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
[CouchDB] 초간단 Mac에서 CouchDB 실행하기
Posted at 2009/07/07 21:37// Posted in 나만의 작업/DataBaseone-click으로 가장 간단하게 Mac에서 실행하는 방법! 이보다 더 간단할 수 없다.
링크 : http://janl.github.com/couchdbx/
2009년 7월 현재 0.9.0-R13B 버젼을 받을 수 있다.
이 버젼엔 Erlang R13B, Spidermonkey 1.7 and ICU 3.8 가 포함되어 있다.
앞으로 계속 업데이트 될테니 저 링크에서 다운로드 받으세요~~
다운로드 후 더블클릭 하면 실행된다.! 끝!
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] HTTP Document API (0) | 2009/07/14 |
|---|---|
| [CouchDB] Compaction (0) | 2009/07/13 |
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
[CouchDB] 1. CouchDB가 뭐지?
Posted at 2009/07/07 10:34// Posted in 나만의 작업/DataBaseCouchDB는 아파치 오픈소스 프로젝트이고, DB이지만 Non-Relational Database이고 document-oriented기반이라고 합니다.
뭔가..새로운 포스가 느껴지는데.. 뭔가 개성이 강한 느낌..으로 조금 더 살펴보면,
Couch를 사전에서 찾아보면 이런 뜻을 가지고 있는데..
2 《문어·시어》 침상, 잠자리
3 《일반적으로》 휴식처 《풀밭 등》;(야생 동물의) 은신처, 굴(lair)
딱 이름만 듣고는 이런 DB를 만들고 싶지 않았을까란 생각은 들지만, Cluster Of Unreliable Commodity Hardware의 약자라고 하네요..
특징은
* Schema-less document store (document in JSON format)
* Multi-Version-Concurrency-Control model
* User-defined query structured as map/reduce
* Incremental Index Update mechanism
* Multi-Master Replication model
* Written in Erlang (Erlang is good)
가장 중요한 점은 RESTful API를 이용한다는 것!
허걱 Erlang(얼랭)으로 쓰여져있다고 하고 스키마 필요없는 document을 저장하는 방식이고 이 document는 JSON format으로 데이터를 교환한다고 하는군요. 그리고 query는 map/reduce 구조를 이용합니다.
CouchDB은 처음에 C++로 만들어졌지만 도중에 Erlang으로 교체되었고, CouchDB의 default view server는 C를 사용한 모질라의 Spidermonkey Javascript library를 이용합니다.
Apache 2.0 License 이고, CouchDb설치시에 웹서버가 같이 설치되어 Client와 HTTP로 통신하고 Data(Document)를 JSON으로 주고 받는다고 합니다.
처음에 호기심 가지고 보다보니 참 개성강한 듯 하군요.
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] Compaction (0) | 2009/07/13 |
|---|---|
| [CouchDB] HTTP database API (2) | 2009/07/09 |
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
| JAVA DB - Derby (4) | 2007/05/12 |
[오라클] 초성검색
Posted at 2009/04/28 17:39// Posted in 나만의 작업/DataBase'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] HTTP database API (2) | 2009/07/09 |
|---|---|
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
| JAVA DB - Derby (4) | 2007/05/12 |
| [Oracle] Introduction to Oracle 9i : SQL (2) | 2007/02/11 |
자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들
Posted at 2009/04/22 15:03// Posted in 나만의 작업/DataBase'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
|---|---|
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
| JAVA DB - Derby (4) | 2007/05/12 |
| [Oracle] Introduction to Oracle 9i : SQL (2) | 2007/02/11 |
| [Oracle] sql Vi 편집기 (1) | 2007/02/06 |
Oracle instant client 설치(Mac OSX, Windows)
Posted at 2009/01/07 21:36// Posted in 나만의 작업/DataBase'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
|---|---|
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
| JAVA DB - Derby (4) | 2007/05/12 |
| [Oracle] Introduction to Oracle 9i : SQL (2) | 2007/02/11 |
| [Oracle] sql Vi 편집기 (1) | 2007/02/06 |
JAVA DB - Derby
Posted at 2007/05/12 05:38// Posted in 나만의 작업/DataBase왠지 깜찍(?)하다는 느낌이 듭니다.
이 글을 쓰는 목적은 순전~히 버리의 이기적인 내용정리라고 할까요~
이렇게 쓰면서 제 자신이 정리하고자 하는 목적입니다. 제가 이해가 잘못된곳도 있을지도 몰라요~
Derby는 2005년 말에 Apache DB sub project로 제작되었는데
Embed와 Network Server를 둘다 지원해주는 순수 자바로 제작된 DB입니다.
서버로 띄우거나 어플리케이션에 내장하는 것이 가능하기 때문에 따로 DB를 띄우지 않고도 자바 어플리케이션 작성하는 것이 가능합니다. 이것이 큰 장점~
이 아이는, JVM만 설치되어 있으면 인스톨없이 작동되고 프로그램짤때
jar파일만 추가시켜 주면 됩니다.
|
3. Database (Top 10중 3번째에 글이 나와있네요)
For a great out-of-the-box development experience with database applications, the final Mustang development kit – though not the Java Runtime Environment (JRE) – will co-bundle the all-Java JDBC database, Java DB based on Apache Derby. Developers will get the updated JDBC 4.0, a well-used API that focuses on ease of use – although it contains many feature additions like special support for XML as an SQL datatype and better integration of Binary Large OBjects (BLOBs) and Character Large OBjects (CLOBs) into the APIs. Additional features that improve ease of use include removal of some JDBC boilerplate and some of the new annotations that make SQL strings embed better into your JDBC application – like decorating yourgetAllUsers()method with an@Query(sql="select * from user")annotation, and that being all you need.
더 자세한 설명은,
Apache Derby 소개
Network Server 모드는 흔히쓰는 client/server방식 JDBC와 비슷하니, 간단히 하고접해보지 못한 Embedded Derby 정리하겠습니다.
Eclipse에서 Plugin을 이용하면 Eclipse내부에서 derby Network Server를 시작할수있다.(Network Server일 경우,)
방법
- Unzip the two Derby Eclipse plugins (derby_core_plugin_10.1.2.zip and derby_ui_plugin_1.1.0.zip) into your eclipse installation folder (ECLIPSE_ROOT). Detailed instructions are available here: http://db.apache.org/derby/integrate/plugin_howto.html#Installing+the+plug-ins
- In your ECLIPSE_ROOT/plugins folder, you should have a folder named org.apache.derby.core_10.1.2. Copy the file derbyclient.jar from that folder to your TOMCAT_ROOT/common/lib folder. This installs the Derby JDBC driver into Tomcat for use in a DataSource.
참고 Creating Database Web Applications with Eclipse
Embedded Derby란?
When an application accesses a Derby database using the Embedded Derby JDBC driver, the Derby engine does not run in a separate process, and there are no separate database processes to start up and shut down. Instead, the Derby database engine runs inside the same Java Virtual Machine (JVM) as the application.
So, Derby becomes part of the application just like any other jar file that the application uses.
Derby Embedded Architecture
JDBC applications and Derby basics
1) Derby embedded basics
- JDBC driver
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
- Connection URL
Connection conn=DriverManager.getConnection("jdbc:derby:sampleDB명");
Developing with Apache Derby -- Hitting the Trifecta:
Database development with Apache Derby, Part 2 에서 발취한 내용
Learn- Read Developing with Apache Derby -- Hitting the Trifecta: Introduction to Apache Derby (developerWorks, February 2006), the first article in this series, for a gentle introduction to the Apache Derby database.
- Check out the manuals about how to use the Apache Derby database on the Apache Derby project site.
- Learn how to download and install Apache Derby.
- Learn how to properly verify your download.
- Check out the developerWorks Apache Derby project area for articles, tutorials, and other resources to help you get started with Derby today.
- Read the articles and tutorials about the IBM Cloudscape™ database, which is built using the Apache Derby code base.
- Browse for books on these and other technical topics at the Safari bookstore.
- Browse all the Apache articles and free Apache tutorials available in the developerWorks Open source zone.
Get products and technologies
- Download Apache Derby from the Apache Derby project home page.
- Get downloading details on the latest version of IBM Cloudscape.
그외,
derby를 떠올리자면 Cloudscape를 빼놓을수 없으니,Cloudscape FAQ 에 derby에 대한 내용도 많이 있습니다.
Derby Reference Manual - http://db.apache.org/derby/docs/10.2/ref/ref-single.htmlTuning Derby - http://www.onjava.com/pub/a/onjava/2007/01/31/tuning-derby.html
헉, 날이 밝아버렸네요... 이제 자야겠습니다~
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
|---|---|
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
| JAVA DB - Derby (4) | 2007/05/12 |
| [Oracle] Introduction to Oracle 9i : SQL (2) | 2007/02/11 |
| [Oracle] sql Vi 편집기 (1) | 2007/02/06 |
-
-
2007/05/12 12:39 [Edit/Del]아하! 제가 착각하고 있었습니다~..지적 감사합니다^^
What's New in Java SE 6 Beta2(Mustang)에 보니
여기서 JavaDB를 소개하고있군요,,ㅎㅎ
-
-
[Oracle] Introduction to Oracle 9i : SQL
Posted at 2007/02/11 00:46// Posted in 나만의 작업/DataBase/*****************************************
Introduction to Oracle 9i : SQL
작성일 : 2007.02.06
작성자 : 버리 (www.flyburi.com)
*****************************************/
1. SQL구문
select distinct * column alias(빈칸,AS,””)
from table_name
where column, 표현식, value, 비교연산자(비교,select문, 논리연산자)
order by Asc(default), desc
è Distinct와 order by를 쓰면 내부 그룹화가 발생한다.
è Distinct는 그룹내 정렬이 이루어진다.
2. SQL함수
함수 : 하나 또는 여러 개의 인수를 받아들여 처리한 다음 결과값을 하나를 얻을수있다.
함수의 종류
1) 인수 하나 : 단일행 함수 – 문자, 숫자, 날짜, 일반, 변환
2) 인수 여러 개 : 다중행 함수(그룹함수)
문자함수
1) 대문자 조작함수 : LOWER, UPPER, INICAP(단어 첫글자만 대문자)
2) 문자 조작함수 : CONCAT, SUBSTR, LENGTH, INSTR, LPAD, RPAD, TRIM
알아두기!)
LOWER, UPPER를 사용하는 때
오라클 where 절에서는 인수를 비교할 때 인수를 ASCII값으로 찾기 때문에 대/소문자 구별한다. (내가 정확한 Format을 모를 때)
날짜함수
오라클 데이터베이스는 다음과 같은 내부 숫자 형식으로 날짜를 저장합니다. “세기, 연도, 월, 일, 시, 분, 초”
변환함수
1) 암시적(implicit) 데이터 유형 변환
2) 명시적(explicit) 데이터 유형 변환
일반함수
uk : 쓸수있다.
pk : null값을 가지고 있지 않기 때문에 NVL 함수를 쓸 필요가 없다. 굳이 쓰려면 쓸 수는 있다.
2) NVL2 함수
null에 해당되는지 않되는지만 결과를 리턴해 준다. 어떤 값을 계산해서 리턴하지는 않는다.
3) NULLIF 함수
NULLIF(expr1, expr2) : 두 표현식 비교하여 동일한 경우 null을 반환한다. 동일하지 않을때 첫번째 표현식을 반환한다.
4) COALESCE 함수
첫번째 표현식 null이 아닌 경우 해당 표현식을 반환한다. null인 경우 나머지 표현식에 대해 COALESCE 함수를 적용한다.
3. 조건 표현식
distinct, order by 는 정렬, 그룹화 현상을 일으키기 때문에 퍼포먼스상 매우 좋지 않기 때문에 실무에서 잘 쓰지 않는다.
Cf) 스와핑, 페이징.
DECODE함수는 CASE 표현식과 유사함. 성능이 CASE보다 더 좋음.
함수의 포인트!!! TO_CHAR, NVL, DECODE
4. JOIN
select ename, deptno
from emp, dept;
ename -> 20건, deptno -> 8건
20 * 8 = 160건 : 카티시안 곱 - 조인 조건을 생략한 경우 조인 조건이 부적합하다.
join을 사용하면 퍼포먼스가 떨어진다.
join보다 Sub Query를 사용하는게 퍼포먼스가 좋다.
join조건 쓸때 fk가 설정되어 있는 table이 앞에 나오는 게 빠르다.
1) Equal Join : pk, fk 비교할때, 같은 column이 있을경우 두 테이블에서 비교
column 이름은 36자까지 생성할 수 있다. (스키마에 alias 줄 수 있다. - 인라인뷰)
alias를 사용하면 oracle server는 alias명으로 검색한다.
기본 스키마는 생략가능하다.
alias를 사용하면 메모리 사용이 줄어든다.
alias를 쓸때는 alias를 전부 쓰고, table full name을 쓸 때는 full name을 써야한다.
alias와 table full name을 쓰면 에러난다.
Join table개수는 n-1 (n:join시킬 table수)
Join조건과 where 조건을 쓸 때는 and!! 만 OR!을 쓰면 에러난다.
where 조건과 join 조건 순서는 상관없지만 join조건이 앞에 나오는 것이 퍼포먼스상 좋다.
2) Non Equal Join : Between A and B
동등 연산자가 아닌 연산자를 포함하는 조인 조건, 전혀 다른 Data 값이 존재했을 때 사용한다.
3) Outer Join
Record는 포함하고 있지 않은 쪽에 (+)를 붙여준다.
부족한 쪽에 null 값을 삽입
4) Self Join
하나의 Table을 Alias를 줘서 여러개의 Table인 것처럼 한다.
5. 그룹함수
-> null값을 포함하지 않는다.
count(*)와 count(commission_pct)의 차이를 느낄수 있는 상황
Q) 우리 회사 직원의 commission_pct의 평균을 구해라.
ex1) select avg(commission_pct) from employees;
결과) .2125
ex2) select sum(commission_pct)/20 from employees;
결과) .0425
avg함수를 사용했을때 결과가 ex2)의 결과로 나와야하는데
ex1)에서는 sum(commission_pct)/4로 나눈 결과값이다
암시적으로 avg는 null값을 포함하지 않는다.
=> 해결을 위해,
avg(nvl(commission_pct,0));
SQL문 정리
select distinct * column name alias
from table
where
group by
having
order by
6. SubQuery
SubQuery는 알려지지 않은 값을 찾고 싶을 때 사용하라.
Join문장보다 Subquery를 실행하자!
From 절의 SubQuery에서는 order by 절이 사용가능하지만,
Where, having 절의 SubQuery에서는 order by 절이 사용불가능
SubQuery 결과가 몇 개냐에 따라 단일/다중 연산자를 판단한다.
SubQuery null이 도출될 위험이 있을 때는 사용하지 마라.
SubQuery에서 not in을 피하는게 좋다. Not in은 null값을 찾을 수가 없다. (거의 no rows selected 일 가능성이 높다.)
쓰고싶다면, Is null을 써라.
Ex) select ename
From emp
Where deptno = (select deptno
From dept
Where dname=’%a%’);
결과 및 해석 ) 다른 테이블을 서로 비교하더라도 가능하다. Subquery의 내용은 결과값을 도출하여 값을 비교하기 때문에 가능.
Ex) select ename
from emp e, dept d
where e.deptno = d.deptno;
이 경우에는 join을 써서 할수 있지만, SubQuery가 퍼포먼스상 좋다~
1) ANY 연산자
<ANY : means less than the maximum. : 최대값보다 작은값(최대값 제외)
>ANY : means more than the minimum : 최소값보다 큰값(최소값 제외)
=ANY : IN연산자와 같은 역할
2) ALL 연산자
>ALL : means more than the maximum : 최대값 이상의 값
<ALL : means less than the minimum : 최소값 이하의 값
Ex) data => 9000, 6000, 4000
연산자 결과
In연산자 => 9000,6000,4000
<ANY => 6000, 4000
>ANY => 9000, 6000
>ALL => 9000이상의 값
<ALL => 4000이하의 값
7. iSQL*Plus
* 치환변수 사용
임시적으로 값을 저장.
문장 실행할 때마다 값이 바뀔 때 사용한다.
반복작업을 수행할 때 편리하다.
&변수 : 사용자가 원하는 데이터를 사용할 때마다 입력하고 싶은 경우에 치환변수를 사용.
&&변수 : 한번 입력받은 변수값을 다시 적용할 수 있음
SQL> SELECT id,name,dept_id
2 FROM s_emp
3 WHERE dept_id = &부서번호 ;
Enter value for 부서번호: 112
old 3: WHERE dept_id = &부서번호
new 3: WHERE dept_id = 112
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
|---|---|
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
| JAVA DB - Derby (4) | 2007/05/12 |
| [Oracle] Introduction to Oracle 9i : SQL (2) | 2007/02/11 |
| [Oracle] sql Vi 편집기 (1) | 2007/02/06 |
[Oracle] sql Vi 편집기
Posted at 2007/02/06 19:45// Posted in 나만의 작업/DataBasesql Vi 편집기
L(엘) : list, sql buffer에 있는 내용을 불러들일 때
1(n행번호) <- 1행에 위치한 행의 내용을 보여준다.
1(n행번호) c/*/salary <- 1행에 위치한 *를 salary로 바꿈 (c:change)
Del 3(n행번호) <- 3번째 행이 지워짐
Save buri.sql
Get buri.sql
! : 현재 세션상태 유지한 상태에서 Home 디렉토리로 이동
1(n행번호) text : 라인전체가 변경(1행을 text로 바꿈)
'나만의 작업 > DataBase' 카테고리의 다른 글
| [CouchDB] API Cheatsheet (0) | 2009/07/09 |
|---|---|
| [CouchDB] 초간단 Mac에서 CouchDB 실행하기 (0) | 2009/07/07 |
| [CouchDB] 1. CouchDB가 뭐지? (2) | 2009/07/07 |
| [오라클] 초성검색 (2) | 2009/04/28 |
| 자주 쓰지 않아서 잊어버리는 간단한 Oracle SQL문들 (4) | 2009/04/22 |
| Oracle instant client 설치(Mac OSX, Windows) (0) | 2009/01/07 |
| JAVA DB - Derby (4) | 2007/05/12 |
| [Oracle] Introduction to Oracle 9i : SQL (2) | 2007/02/11 |
| [Oracle] sql Vi 편집기 (1) | 2007/02/06 |



싸늘한 날씨에 감기 조심하세요~
저 오늘 예방접종 주사 맞았어요
이제 끄떡없다는..
[NC]...YellOw님두 감기 조심하세요~