posted by 구름너머 2005. 11. 25. 15:46

http://xrath.com/devdoc/jdk1.5/ko/api/java/util/StringTokenizer.html


java.util
클래스 StringTokenizer
java.lang.Object
java.util.StringTokenizer

모든 구현된 인터페이스:
Enumeration <Object >

--------------------------------------------------------------------------------

public class StringTokenizerextends Object implements Enumeration <Object >

StringTokenizer 클래스를 사용하면(자), 어플리케이션으로 캐릭터 라인을 토큰에 분할할 수 있습니다. 토큰화의 메소드는,StreamTokenizer 클래스에서 사용되고 있는 메소드보다 한층 더 간단합니다. StreamTokenizer 메소드에서는, 식별자, 숫자, 인용 캐릭터 라인은 구별되지 않습니다. 또, 코멘트를 인식해 스킵 하는 일도 없습니다.

단락 문자 (토큰을 나누는 문자)는, 클래스의 작성시, 또는 토큰을 얻을 때마다 지정할 수 있습니다.

StringTokenizer 의 인스턴스는, 작성시의 returnDelims 플래그의 값이 true 나 false 등에 의해서, 동작이 다릅니다.

플래그가 false 의 경우는, 단락 문자는 토큰을 나눌 뿐(만큼)의 것이라고 보여진다. 토큰은 단락지어 문자가 아닌 문자가 1 개 이상 연속하고 있는 부분이다
플래그가 true 의 경우는, 단락 문자는 그 자체가 토큰이라고 보여진다. 토큰은, 1 개의 단락 문자인가, 단락 문자가 아닌 문자가 1 개 이상 연속하고 있는 부분이다
StringTokenizer 오브젝트는 내부적으로, 토큰화 되는 캐릭터 라인내의 현재의 위치를 관리합니다. 몇개의 오퍼레이션은, 이 현재의 위치가 처리된 문자의 끝에 진행하는 것이 있습니다.

토큰은,StringTokenizer 오브젝트를 작성하는데 사용된 캐릭터 라인의 부분 캐릭터 라인을 취득하는 것에 의해 돌려주어집니다.

사용예를 다음에 나타냅니다.

StringTokenizer st = new StringTokenizer("this is a test");
while (st.hasMoreTokens()) { System.out.println(st.nextToken());
}
화면에는 다음과 같이 표시됩니다.

this is a test
StringTokenizer 는, 호환성을 유지하는 목적으로 보관 유지되고 있는 유산 클래스이며,

신규 코드에서는 사용이 추천 되고 있지 않습니다.

이 기능의 사용을 생각하고 있다면,String 의 split 메소드 또는 java.util.regex 패키지를 대신에 사용하는 것을 추천합니다.

다음의 예는,String.split 메소드를 사용해 캐릭터 라인을 기본적인 토큰에 분할하는 방법을 나타냅니다.

String[] result = "this is a test". split("\\s");
for (int x=0;
x<result.length;
x++) System.out.println(result[x]);

화면에는 다음과 같이 표시됩니다.

this is a test


도입된 버젼:
JDK1. 0
관련 항목:
StreamTokenizer

'JAVA' 카테고리의 다른 글

Jsp 기초 - 스크립트 프로그래밍  (0) 2006.02.17
Runtime.getRuntime().exec( cmd )  (1) 2005.11.25
weblogic JDBC 설정...  (0) 2005.11.04
javadoc  (0) 2005.10.01
Definition of JDBC type 4 driver  (0) 2005.09.06
posted by 구름너머 2005. 11. 25. 11:32

1. Shell 스크립트의 첫 번째 줄이 #으로 표기되어 있으면

이 스크립트는 C Shell에 의해 해석된다.

단, 첫 번째 줄이 아닌 다른 줄에 있는 #은 라인주석으로 처리한다.

2. Shell 스크립트의 첫 번째 줄이 #! shell_pathname으로 표기되어 있으면

이 스크립트는 패스에 정의된 Shell에 의해 해석된다.

3. 앞의 두 규칙 중 어느 하나도 만족하지 않으면

기본값으로 Bourne Shell에 의해 해석된다.

예1)

# @(#)local.profile 1.8 99/03/26 ====> Bourne Shell로 해석

예2)

#! /bin/sh ====> Bourne Shell로 해석

예3)

#! /bin/csh ====>C Shell로 해석

'UNIX' 카테고리의 다른 글

Unix 압축/해제 명령어 모음  (0) 2006.03.13
unix timestamp  (0) 2005.12.30
클라이언트(Resolver) 설정  (0) 2005.10.24
C shell, Bourne shell에서의 테스트 방식 비교  (0) 2005.10.17
UNIX에서 날짜 구하기 팁.  (0) 2005.08.25
posted by 구름너머 2005. 11. 24. 13:23
8ㆍ31대책 입법 어떻게 돼 가나
여야, 종부세 이견 많아
박원갑 기자 입력 : 2005/11/15 09:11 수정 : 2005/11/15 19:18 스크랩프린트 목록

요즘 부동산업계의 관심은 온통 여의도에 쏠려 있다고 해도 과언이 아니다. 8ㆍ31부동산 대책의 국회 통과 여부에 따라 시장의 판도가 달라질 수 있기 때문이다. 8ㆍ31대책의 성패는 후속 입법에 달려있는 셈이다.

이번 정기 국회에서 8ㆍ31대책으로 손질해야 하거나 신설해 하는 법안은 15개 정도다.

종합부동산세법,조세특례제한법,소득세법,법인세법,지방세법,지방교부세법,주택법,국민임대주택건설특별조치법,국토의계획및이용에관한법률,부동산등기법,부담금관리기본법,기반시설부담금에관한법률,도시구조개선특별법, 토지보상법 등이다.

종부세 내용 놓고 여야, 첨예한 대립

이 가운데 여야가 가장 첨예하게 대립하는 것은 종합부동산세법이다. 당정은 종합부동산세 과세 기준 금액을 확대(주택 9억원→6억, 나대지 6억원→3억원)하고 인별 합산과세에서 세대별 합산 과세로 변경하겠다는 입장이다. 종부세 실효세율은 2009년까지 1%, 서민들이 부담하는 재산세의 실효세율은 2017년까지 1%로 각각 올리기로 했다.

그러나 한나라당은 종부세 과세기준 금액을 현행대로(주택 6억,나대지 6억원)유지하고 합산과세의 경우 세대별로 하되 예외를 인정해주자는 것이다. 한나라당 관계자는 “세대별 합산과세 예외는 위헌소지 문제를 해결하기 위한 것”이라고 설명했다.

보유세 평균 실효세율도 2009년까지 0.5% 수준으로 유지하자는 입장이다. 또 1가구 1 주택자에겐 종합부동산 대상에서 제외해줄 것을 요구하고 있다.

한나라당 관계자는 “내년부터 부동산 실거래가 신고제가 도입되면서 전반적으로 공시가격(기준시가)이 올라간다”며 “여당안대로 시행될 경우 정부의 예측보다 훨씬 많은 납세자들이 종부세 대상에 포함될 수 있다”고 말했다.

이에 대해 열린우리당 관계자는“당정 합의안은 3개월간 다양한 의견수렴 과정을 거쳐 만든 것인 만큼 후퇴하기 힘들다“고 말했다.

열린당 관계자는 "한나라당이 혼인전 취득 부동산 ,상속및 증여 주택,자금출처 입증 주택 등을 합산 대상에서 제외하는 내용의 법안을 제출한 것과 관계없이 당정은 예외를 인정하지 않고 원안대로 추진할 방침"이라고 설명했다.

또 일부 여야 의원이 각각 65세 이상, 60세 이상 노령자를 대상으로 종부세를 경감하는 내용의 법안을 발의했으나 당정은 법안심의 과정에서 이 같은 보완주장도 수용하지 않기로 했다고 그는 강조했다.

당정은 2007년부터 모든 부동산을 팔때 양도세를 전면 실거래가로 과세하겠다는 입장이다. 하지만 한나라당은 2006년 1월 1일 이후 매입한 부동산부터 적용하자고 맞서고 있다.

주택,지방세 법률은 큰 이견 없어

1가구 2주택 양도세 중과에 대해선 이견이 없다. 하지만 양도세 중과 예외 대상,장기보유 특별공제 배제등에 대해서는 입장이 엇갈리고 있다.

주택공급과 관련된 법안들은 대부분 통과됐거나 무난하게 통과될 전망이다. 국회건설교통위원회는 국토계획및 이용에 관한 법률, 개발이익환수법, 토지보상법, 국민임대주택법 등을 이미 의결했다.

주택법의 경우 한나라당은 당초 분양권 전매 금지를 전국적으로 확대실시하자는 입장이었으나 정부 측이 주장하는 대로 투기지역만 한정해 적용하자는 의견을 받아들여 결국 통과됐다.

또 옛 도심을 개발하기 위해 여당은 도시구조개선특별법, 한나라당은 사업비의 50%를 재정이 의무적으로 지원하는 뉴타운 특별법을 각각 제출했다.하지만 내용에 큰 차이가 없어 쉽게 통과될 것으로 보인다.

취득ㆍ등록세율도 입장이 다소 다르나 조정할 수 있는 수준이다. 당정은 취득ㆍ등록세율을 내년부터 1%포인트 인하하기로 했다.

하지만 한나라당은 취득세율과 등록세율을 각각 1%포인트 내린 뒤 2009년까지 폐지하자고 맞서고 있다. 행정자치부 관계자는 “종부세 등과는 달리 취득ㆍ등록세율은 낮추는 데 여야가 입장을 같이하고 있어 법안 통과에 큰 진통은 겪지 않을 것 같다”고 말했다.

8.31부동산 대책 후속 입법 어디까지 왔나
소관위원회
법안
주요 내용[한나라당 입장]
현재 진행 상황
도입 예정 시기
재정경제위
종합부동산세법
*주택,기준시가 9억→6억원,나대지 6억원→3억원[현행 대로 유지]
*인별 합산→세대별 합산[세대별 합산하되 예외 인정]
재경위 소위 심의중
내년 6월
소득세법
*2주택자 양도세,내년 실거래가
*2주택자 양도세,50% 중과(2007년 시행)
[세율 인하,예외 인정 필요]
재경위 소위 심의중
내년 1월
법인세법
*법인이 소유한 비사업용 토지,양도세에 30% 특별부과세 부과
재경위 소위 심의중
2007년 1월
조세특례제한법
*자경농지 대토 비과세요건 축소
재경위 소위 심의중
내년 1월
소득세법(정부 제출)
재개발,재건축 입주권 주택으로 간주(법시행 시점이후 관리처분 받은 단지 적용)
재경위 소위 심의중
내년 1월
건설교통위
주택법
*공공택지내 모든 아파트 원가연동제 적용
*분양가격 공시항목 확대(7개)
*공공택지내 아파트 전매제한기능 강화
(25.7평이하-수도권 10년,지방 5년)
(25.7평초과-수도권 5년,지방 3년)
건교위 통과
내년 2월
국민임대주택특별조치법
*국민임대주택단지 개발 상한면적 확대(30만→60만평)
건교위 통과
내년 상반기
국토의계획및이용에 관한 법률
*허가구역내 토지구입요건 강화
*토지 파파라치제도 도입
*토지이용의무 위반자 과태료 상향
건교위 통과
내년 3월
토지보상법
*토지투기 우려지역,부재지주에게 일정액 이상 채권으로 지급
건교위 통과
내년3월
개발이익환수에 관한 법률
*토지로부터 발생하는 초과개발 이익 환수
건교위 통과
내년 1월
도시구조개선특별법(제정)
*강북 등 광역개발[한나라당,뉴타운 특별법]
건교위 심의중
내년 6월
기반시설 부담금(제정)
*건물신증축,재개발,재건축때 기반시설 설치비용 건축주가 일부 부담
건교위 심의중
내년 6월
행정자치위
지방세법
*등록세 1%포인트 인하[취득세,등록세 모두 1%인하,2009년엔 폐지]
행자위 상정 예정(이번주)
내년 1월
지방교부세법
*종부세 세수로 지자체 세수부족분 보전
행자위 상정 예정(이번주)
내년 1월
법제사법위
부동산등기법
실거래가 등기부등본 기재
법사위 심의중
내년 1월
자료:재정경제부,건설교통부

posted by 구름너머 2005. 11. 17. 19:30

No. 10939

PL/SQL에서 DBMS_PIPE를 이용해서 PRO*C CALL하기
===============================================

PURPOSE
--------
다음은 DBMS_PIPE를 이용하여 PRO*C 를 Call하는 방법을 알아본다.


Explanation
----------------

일단 먼저 DBMS_PIPE package에 대해 알아보자.

이 package는 SYS의 소유이며, catproc.sql을 실행함으로써 생성된다.
이를 run하기 위해서는 execute privileges가 있어야 한다.

이 package는 같은 database에 연결된 session끼리 message 를 send
할 수 있도록 한다. 그 중 한 session 이 PL/SQL block 이고 다른
session 이 C program일 수 있다.

그러면 다음에서 daemon.pc 와 daemon.sql을 살펴보자:

daemon.pc 는 C program이고 이는 message를 receive할 수 있도록
running 되고 있어야 한다.

그러나 이는 대부분 sleeping state이다.
이 상태에서 program은 pipe를 통해 전달되는 message를 기다리며
looping 상태에 있다.
message 를 받을 때 이 program은 wake up되며 message를 실행한다.

이 'sleeping' 과 'waking up'은 dbms_pipe.receive_message() 에
의한다.

daemon.sql 은 PL/SQL package 이고 이 package는 deamon 에
message 를 send하고 receive 할 procedure 로 구성되어 있다.

deamon 은 STOP command 를 제외하고, 항상 message 를 package 에게
다시 send 한다.

이 process 를 위해 sql*plus 에서 deamon.sql 을 실행하여 package를
생성하여야 하고, deamon.pc 를 compile 하여 실행 file 을 만들어야
한다.
compile 시 precompile option 인 'sqlcheck=semantics'를 사용하여야
한다. ( program 이 embedded PL/SQL block을 가지므로 )

또한 'userid' precompile option 을 사용하여 precompiler가 어떻게
database에 connect 되는지 알 수 있도록 한다.

eg) userid = scott/tiger'.

우리는 system commands 를 실행하고, (limited) dynamic sql을
실행하기 위해
functions daemon.execute_system() and daemon.execute_sql()를
call하기 위해 package를 사용할 수 있다.


이 daemoon packaged procedures execute_system() 과 execute_sql() 은
SQL*Plus, 다른 precompiler의 embedded PL/SQL, 심지어 forms의
trigger 에서 실행 가능하다 .

이 package는 오직 non-query SQL statements(no bind variable)를
실행시만 사용 가능하다.

NOTE: 또한 daemon package는 결과를 display 시 dbms_output
package 를 사용한다.
이를 위해 'set serveroutput on' 이 미리 define되어 있어야 한다.


/***************************************************************
File: daemon.sql

이는 daemon package이고, dbms_pipe 를 통해 deamon listener에게
message 를 send한다. 이는 2 function 과 1 procedure 를 갖는다 :

execute_sql: 첫번째 argument 로 주어진 sql command 를 실행을
위해 daemon listener 에게 넘겨준다. 이 sql command 는 query이면
안 된다.
sqlcode를 return 한다.

execute_system: 첫번째 argument로 주어진 system command를 실행을
위해 daemon listener 에게 넘겨준다. system command 의 결과를
return 한다.

stop: deamon 이 exit 하도록 한다.
이후 execute_sql 과 execute_system 은 deamon 이 restart
될 때까지 실행 불가능하다.

이 package는 pipe name 을 통해 message 를 send 하는데,
이는 dbms_pipe.unique_session_name 이다. 이런 방법으로 각
session은 자기의 pipe를 통해 실행되고 다른 session의 message를
receive할 수 없다.
***************************************************************/

create or replace package daemon as
/* Executes a non-query sql statement or plsql block. Arguments:
command: the sql statement to execute
timeout: (optional) number of seconds to wait to send or
receive a message
Returns the sqlcode after execution of the statement. */

function execute_sql
(command varchar2, timeout number default 10)
return number;

/* Executes a system (host) command. Arguments:
command: the command to execute
timeout: (optional) number of seconds to wait to send or
receive a message.
Returns the value passed to the operating system by the
command. */

function execute_system
(command varchar2, timeout number default 10)
return number;

/* Tells the daemon listener to exit. Arguments:
timeout: (optional) number of seconds to wait to
send the message.*/

procedure stop(timeout number default 10);
end daemon;
/

create or replace package body daemon as

function execute_system
(command varchar2, timeout number default 10)
return number is

s number;
result varchar2(20);
command_code number;
pipe_name varchar2(30);
begin

/* Use uniqe_session_name to generate a unique name for the
return pipe.
We include this as part of the inital message to the daemon,
and it is send along the pipe named 'daemon'. */

pipe_name := dbms_pipe.unique_session_name;

/* Send the 'SYSTEM' command to the daemon. */
dbms_pipe.pack_message('SYSTEM');
dbms_pipe.pack_message(pipe_name);
dbms_pipe.pack_message(command);
s := dbms_pipe.send_message('daemon', timeout);
if s <> 0 then
raise_application_error(-20010,
'Execute_system: Error while sending. Status = ' || s);
end if;

/* Check for the handshake message. Note that we are now
listening on the pipe which is unique to this session. */

s := dbms_pipe.receive_message(pipe_name, timeout);
if s <> 0 then
raise_application_error(-20011,
'Execute_system: Error while receiving. Status = ' || s);
end if;

/* Get the operating system result code, and display it using
dbms_output.put_line(). */

dbms_pipe.unpack_message(result);
if result <> 'done' then
raise_application_error(-20012,
'Execute_system: Done not received.');
end if;

dbms_pipe.unpack_message(command_code);
dbms_output.put_line('System command executed. result = ' ||
command_code);
return command_code;
end execute_system;


function execute_sql(command varchar2, timeout number default 10)
return number is

s number;
result varchar2(20);
command_code number;
pipe_name varchar2(30);
begin


/* Use uniqe_session_name to generate a unique name for the
return pipe.
We include this as part of the inital message to the daemon,
and it is send along the pipe named 'daemon'. */

pipe_name := dbms_pipe.unique_session_name;

/* Send the 'SQL' command to the daemon. */
dbms_pipe.pack_message('SQL');
dbms_pipe.pack_message(pipe_name);
dbms_pipe.pack_message(command);
s := dbms_pipe.send_message('daemon', timeout);
if s <> 0 then
raise_application_error(-20020,
'Execute_sql: Error while sending. Status = ' || s);
end if;

/* Check for the handshake message. Note that we are now
listening on the pipe which is unique to this session. */
s := dbms_pipe.receive_message(pipe_name, timeout);
if s <> 0 then
raise_application_error(-20021,
'Execute_sql: Error while receiving. Status = ' || s);
end if;

/* Get the result code from the SQL statement, and display
it using dbms_output.put_line(). */
dbms_pipe.unpack_message(result);
if result <> 'done' then
raise_application_error(-20022,
'Execute_sql: Done not received.');
end if;

dbms_pipe.unpack_message(command_code);
dbms_output.put_line('SQL command executed. sqlcode = ' ||
command_code);
return command_code;
end execute_sql;


procedure stop(timeout number default 10) is
s number;
begin

/* Send the 'STOP' command to the daemon. */
dbms_pipe.pack_message('STOP');
s := dbms_pipe.send_message('daemon', timeout);
if s <> 0 then
raise_application_error(-20030,
'Stop: Error while sending. Status = ' || s);
end if;
end stop;

end daemon;
/

/**************************************************************
File : daemon.pc

이것은 deamon listener를 위한 source code.
이 program은 3개의 'daemon commands':

STOP : oracle 로부터 disconnect & exit
SYSTEM : operating system command 처럼 pipe 의 다음 item 을 실행.
SQL : sql 문장처럼 pipe 의 다음 item 을 실행. 또한 sqlcode 를
return

* compile 방법 :

7.x인 경우 => make -f proc.mk EXE=daemon OBJS=daemon.o
PROCFLAGS="sqlcheck=semantics userid=scott/tiger" build

8.x인 경우 => make -f demo_proc.mk EXE=daemon OBJS=daemon.o
PROCFLAGS="sqlcheck=semantics userid=scott/tiger" build

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

#include <stdio.h>
#include <string.h>
EXEC SQL include sqlca;

EXEC SQL begin declare section;
char *uid = "scott/tiger"; /* User/password to connect to Oracle */
int status; /* Return value for dbms_pipe.send_message
and dbms_pipe.receive_message */
varchar command[20]; /* Daemon command to execute */
varchar value[2000]; /* Value (SQL statement or system command)
associated with previous daemon command */
varchar return_name[30]; /* Name of the pipe on which to send the
results */
EXEC SQL end declare section;

/* This is the error handler for connecting to Oracle.
If we failed on the connection attempt, we need to exit the program. */
void connect_error() {

char msg_buffer[512];
int msg_length;
int buffer_size = 512;

EXEC SQL whenever sqlerror continue;
sqlglm(msg_buffer, &buffer_size, &msg_length);
printf("Daemon error while connecting:\n");
printf("%.*s\n", msg_length, msg_buffer);
printf("Daemon quitting.\n");
exit(1);
}


/* This is the general error handler. Note that we don't exit the program
in this case. We just print the error and continue. This is because any
errors probably will not affect future operations, and we should keep the
daemon running. This of course depends on the error, and you may want to
change this behavior. */
void sql_error() {

char msg_buffer[512];
int msg_length;
int buffer_size = 512;

EXEC SQL whenever sqlerror continue;
sqlglm(msg_buffer, &buffer_size, &msg_length);
printf("Daemon error while executing:\n");
printf("%.*s\n", msg_length, msg_buffer);
printf("Daemon continuing.\n");
}

main() {

EXEC SQL whenever sqlerror do connect_error();
EXEC SQL connect :uid;
printf("Daemon connected.\n");

EXEC SQL whenever sqlerror do sql_error();
printf("Daemon waiting...\n");
while (1) {
/* Wait for a message to be received, using pipe daemon. */
EXEC SQL EXECUTE
begin
:status := dbms_pipe.receive_message('daemon');
if :status = 0 then
dbms_pipe.unpack_message(:command);
end if;
end;
END-EXEC;

if (status == 0) {
/* At this point, we have successfully received a message.
Now we need to determine which daemon command to execute. */
command.arr[command.len] = '\0';
if (!strcmp((char *)command.arr, "STOP")) {
/* STOP command received. Simply exit the program. */
printf("Daemon exiting.\n");
break;
}

else if (!strcmp((char *)command.arr, "SYSTEM")) {
/* SYSTEM command received. Unpack the next 2 values.
These will be the name of the return pipe, and the command
to pass to the operating system. */
EXEC SQL EXECUTE
begin
dbms_pipe.unpack_message(:return_name);
dbms_pipe.unpack_message(:value);
end;
END-EXEC;
value.arr[value.len] = '\0';
printf("Will execute system command '%s'\n", value.arr);

/* Execute the command. */
status = system(value.arr);

/* Send a message back to indicate that the command has been
executed. Also send the result of the system command.
Use the pipe passed in from the first message for this. */

EXEC SQL EXECUTE
begin
dbms_pipe.pack_message('done');
dbms_pipe.pack_message(:status);
:status := dbms_pipe.send_message(:return_name);
end;
END-EXEC;

if (status) {
printf("Daemon error while responding to system command.");
printf(" status: %d\n", status);
}
}

else if (!strcmp((char *)command.arr, "SQL")) {
/* SQL command received. Unpack the next 2 values. These will be
the name of the return pipe, and the SQL command to execute. */
EXEC SQL EXECUTE
begin
dbms_pipe.unpack_message(:return_name);
dbms_pipe.unpack_message(:value);
end;
END-EXEC;
value.arr[value.len] = '\0';
printf("Will execute sql command '%s'\n", value.arr);

/* Execute the command. Note that we don't want to go to
the error handler if there is a problem - we just pass
the code back. */
EXEC SQL whenever sqlerror continue;
EXEC SQL EXECUTE IMMEDIATE :value;
status = sqlca.sqlcode;

/* Reset the error handler, and send a message back
to indicate that the command has been executed.
Also send the sqlcode.
Use the pipe passed in from the first message for this. */

EXEC SQL whenever sqlerror do sql_error();
EXEC SQL EXECUTE
begin
dbms_pipe.pack_message('done');
dbms_pipe.pack_message(:status);
:status := dbms_pipe.send_message(:return_name);
end;
END-EXEC;

if (status) {
printf("Daemon error while responding to sql command.");
printf(" status: %d\n", status);
}
}

else {
/* Invalid daemon command received. */
printf("Daemon error: invalid command '%s' received.\n", command.arr);
}
}
else {
/* We get here if an error was received while the daemon was waiting.
If the status = 1, this is a timeout and is probably not a problem.
However, the default timeout for the receive_message function is
1000 days, so unless the daemon is kept running for over 3 years
without receiving a signal, you won't time out. */
printf("Daemon error while waiting for signal.");
printf(" status = %d\n", status);
}
}

EXEC SQL commit work release;
}

Reference Documents
--------------------
<Note:14082.1>

posted by 구름너머 2005. 11. 17. 19:29

No. 10342

DBMS_PIPE NOT DECLARED ERROR 발생 시
====================================

발생원인 1)

DBMS_PIPE는 oracle install시에 $ORACLE_HOME/rdbms/admin/catproc.sql을
실행함으로써 생성되도록 되어 있는 stored package이다.
다른 stored package(DBMS_OUTPUT....)등은 생성직후 sys를 owner로한
stored package에 대해 public synonym을 생성한 후 바로 이 synonym에
대해 public에게 execute previlege가 grant되지만 DBMS_PIPE는 생성만
되도록 되어 있기 때문에 사용하고자 하는 user에게 별도의 grant작업이
필요하다.

-> 확인사항 및 해결 방법

1) sqldba에서
select * from dba_objects where object_name = 'DBMS_PIPE';
를 수행하여 DBMS_PIPE에 관한 자료가 sys가 owner인 package
spec,package body,synonym만 나타나야 한다.
2) sqldba에서
grant execute on DBMS_PIPE to user_name;
을 실행하여 해당 user에게 grant한다.

발생원인 2)

DBMS_PIPE는 sys가 owner이어야 한다.
user의 실수로 system이나 다른 별도의 user로 connect하여 catproc.sql을
실행한 경우에 발생한다.

-> 확인사항 및 해결방법

1) sqldba에서
select * from dba_objects where object_name = 'DBMS_PIPE';
를 수행하여 DBMS_PIPE에 관한 자료가 sys나 public이 아닌 다른
user가 owner로 되어 있는 DBMS_PIPE object를 drop시킨다.
2) sqldba에서
grant execute on DBMS_PIPE to user_name;
을 실행하여 해당 user에게 grant한다.

posted by 구름너머 2005. 11. 17. 19:28

No. 12052

AUTONOMOUS TRANSACTION(8I NEW FEATURE)에 대한 소개
==================================================

autonomous transaction은 child transaction이라고도 불리우며 Oracle
8i부터 제공되는 새로운 기능이며 현재까지는 pl/sql을 통해서만 구현이
가능하지만 앞으로는 OCI까지 확장될 예정이다.

pl/sql routine의 declare section 중 어떠한 곳에서라도 아래의 progma
(compiler directive)를 지시함으로써 autonomous로 구분이 가능하다.

pragma AUTONOMOUS_TRANSACTION;

'pragma'는
1) top-level anonymous blocks
2) local, standalone or packaged functions and procedures
3) methods of object types
4) database triggers의 declare section 어디에서나 나타낼 수 있슴.

아래의 경우에는 사용이 불가능.

1) outside of a declase section
2) nested block의 declare section
3) package specification
4) package body 중 procedure나 function definition 외부
5) type body중 method definition의 외부

autonomous transaction(tx) 내에서 명시적으로 rollback이나 commit을
하여야 한다. 만일 이를 위반하였을 경우 main transcation 및 child
transaction 모두 error 발생과 함께 rollback이 되게 된다.

main transaction이 수행 중이고 child transaction이 아래의 상태의 경우 :

1) autonomous transcation으로 선언된 code unit의 declare section에서
기술된 statement가 수행 중인 동안 parent tx는 active로 남아있게 된다.

2) "begin" 이후의 첫 executable step을 만나게 되면 parent transaction은
유보되고 새로운 tx(child tx)가 시작된다.

3) 이 code unit은 normal하게 수행이 되나 tx context는 새로운 transaction로
설정된다.

4) autonomous code unit에서 commit 이나 rollback 이 수행되면 이
autonomous tx은 종료된다. 이 때까지 parent(main) tx는 계속 유보상태로
남아 있으며 autonomous unit에서 계속되는 operation이 있다면 새로운 tx이
시작된다.

5) autonomous code unit에서 exit를 하게 되면 transaction context는
parent로 전환이 된다.

transaction context의 변경은 session parameter에 영향을 주지 않는다.
따라서 parent transaction 에서 적용된 session parameter는 그대로 child
tx에서도 영향을 미치게 된다.
parent tx와 child tx는 서로 독립적이므로 lock 역시 공유하지 못한다.
만일 parent tx에서 점유된 lock을 child에서 소유하고자 한다면 dead lock
현상이 발생할 것이다. 이런 경우 ORA-60 이 발생되고 child tx는 자동적으로
rollback 된다.

<주의>
ORACLE 8.1.6 README에서는 분산 transaction에서 autonomous tx 사용 시
dead lock 발생 시 distributed lock timeout을 정상적으로 하지 못한다는
주의사항이 소개되고 있슴.

[예제]

create table test_lobs (c1 number,c2 clob);
create table msg (msg varchar2(120));

create or replace function getlen (p1 in clob,
p2 in number) return number as
pragma AUTONOMOUS_TRANSACTION;
len number;
buf varchar2(120);
tlen number;
begin
len := dbms_lob.getlength(p1);
if len != 0 then
dbms_lob.read(p1,len,1,buf);
dbms_output.put_line('Value: '||buf);
insert into msg values (buf);
commit;
end if;

select dbms_lob.getlength(c2) into tlen
from test_lobs where c1=p2;

dbms_output.put_line('Length selected from table is '||tlen);
return len;
end;

insert into test_lobs values (1,'Hello');
insert into test_lobs values (2,'The quick brown fox');
commit;

declare
cl1 clob;
cl2 clob;
ret number;
begin
select c2 into cl1 from test_lobs where c1 = 1 for update;
select c2 into cl2 from test_lobs where c1 = 2;
ret := getlen(cl1,1);
dbms_output.put_line('Length of first row is '||ret);
ret := getlen(cl2,2);
dbms_output.put_line('Length of second row is '||ret);
dbms_lob.writeappend(cl1,6,' there');
ret := getlen(cl1,1);
dbms_output.put_line('Length of first row is now '||ret);
end;

posted by 구름너머 2005. 11. 17. 14:05
‘日을사늑약 왜곡문서’ 원문 공개


일본 조선대 강성은 교수가 14일 공개한 1905년 을사늑약 직후 이토 히로부미가 일왕에게 제출한 복명서 초안. ‘한국 황제는 대체로 이번 제안에 동의하는 것이 아니고(同意セラルルニアラザレバ)’로 썼던 부분 위에 줄을 긋고 ‘동의하지 않으면 안 되는 까닭(同意セラルルノ止ムヲ得ザル所以)’ 등으로 고쳐 쓴 흔적이 뚜렷하다. 사진 제공 국민일보

1905년 을사늑약 체결 직후 이토 히로부미(伊藤博文) 당시 일본 특파대사가 일왕에게 올린 출장보고서 초안에 고종이 이에 반대했다는 내용이 적혀 있었으나 이를 동의했다는 내용으로 고쳐 적은 사실이 확인됐다.

총련계 대학인 일본 조선대 강성은(康成恩·55) 교수는 14일 이토의 수행 비서였던 스즈키 게이로쿠(都筑馨六)가 그해 11월 18일 을사늑약이 체결된 뒤 일왕에게 올리기 위해 12월 9일 작성한 복명서 초안의 원문 사본을 공개했다.

한자와 일본어로 쓰인 이 복명서의 24행은 ‘한국 황제는 대체로 이번의 제안에 동의하는 것이 아니고’라고 쓰여 있었으나 ‘하는 것이 아니고’ 위에 줄을 긋고 바로 옆에 ‘하지 않으면 안 되는 까닭’으로 고쳐져 있다.

강 교수는 14일 본보와의 통화에서 “2001년 일본국회도서관에 소장된 ‘스즈키 게이로쿠 관계 문서’에서 이를 찾아내 그해 미국 하버드대에서 열린 국제토론회에서 그 내용을 공개했고 2002년 일본에서 ‘을사5조약 연구’라는 책을 통해 이를 발표했으나 원문을 공개한 것은 처음”이라고 말했다.



서울대 이태진(李泰鎭·국사학) 교수는 “지금까지 일부 일본학자들은 이 복명서의 최종본 내용과 을사오적이 조약 체결 후 고종에게 바친 ‘오대신상소문’을 근거로 삼아 고종의 협상지시로 조약 체결이 이뤄졌으므로 을사늑약이 합법적이라고 주장해 왔다”며 “그러나 복명서 초안의 조작 가능성이 높아짐에 따라 이 같은 주장의 근거가 취약해지게 됐다”고 말했다.

권재현 기자 confetti@donga.com

'세상의진리방' 카테고리의 다른 글

[펌] 앞으로 곧 있을 대환란  (0) 2006.01.14
지옥의 실상-1/백스터 여사의 내가본 지옥  (0) 2006.01.12
을사늑약 100주년 오늘:2005/11/17  (0) 2005.11.17
월식-제주에서 촬영  (0) 2005.10.18
월식-서울2  (0) 2005.10.18
posted by 구름너머 2005. 11. 17. 09:27

을사조약을 말함이나 을사년에 체결된 굴욕적인 조약을 말함이다.

한일합방을 경술국치라 말하듯이 이러한 역사적 사실을 우리는

정확히 알고 용어도 제대로 써야 하겠다.

을사늑약에 대한 배경 설명이 있는 곳: 대한제국황실복원추진위원회 http://blog.paran.com/srkr/3537717

중앙일보 : http://news.joins.com/en/200511/15/200511151930567071c000c030c031.html

동아일보 : 아래

====================

을사늑약 100년…“日강압으로 을사늑약 체결”


을사늑약의 부당성을 알린 한규설의 증언을 보도한 1930년 1월 1일자 동아일보 기사. ‘한말정객의 회고담-미랭시(未冷屍)에 유하언(有何言)’이라는 제목과 대한제국 대신 차림의 한규설 사진이 함께 실려 있다. 동아일보 자료 사진

《17일은 을사늑약 체결 100주년이 되는 날이다. 을사늑약의 부당함은 그동안 여러 자료와 증언을 통해 밝혀져 왔다. 특히 일제의 강압 통치가 한창이던 1930년 1월 1일자 동아일보 신년특집호 2면에 실린 한규설(韓圭卨)의 증언은 을사늑약이 일제의 강압으로 체결된 것임을 명백히 폭로했다. 1905년 11월 17, 18일 을사늑약 체결 당시 참정대신(내각 서열 2위, 당시 총리 역할 수행)이던 한규설은 을사늑약 체결 이후 25년간 두문불출하다가 본보 지면을 통해 처음이자 마지막으로 당시의 강압적 상황을 생생히 증언했다.》

“지금에 죽은 사람을 찾아와서 무슨 들을 말이 있겠소. 아직 말은 하오만은 ‘미랭시(未冷屍)’이지요. 식지 않은 송장과 다름이 있겠소. 을사년 이후 말도 않고 듣지도 않으려 하였더니 요새는 귀도 멀고 눈도 어둡게 되었으니 아주 송장이 되려는가 보오. 입이 아직 성해 말은 하오.”

한규설은 이토 히로부미(伊藤博文)가 방한한 1905년 11월 9∼18일에 이르는 급박한 상황을 자세히 진술하면서 당시 모든 대신이 조약 체결에 반대한다는 결의를 다졌으나 군대까지 동원한 일본의 강압에 의해 조약이 체결됐음을 증언했다.

“17일 일본공사관에 불려갔다가 다시 궁중으로 돌아와 어전회의를 열었는데 도장을 찍을 수 없다고 임금께 아뢰었다. 외부대신 박제순(朴齊純)은 도장을 생명과 교환할 결심을 했다고 말했다. 이 사이 일본 외교관과 군인들이 무수히 내전 가까이 들어서 형세가 매우 절박했다. 학부대신 이완용(李完用), 농상공부대신 권중현(權重顯)과 내부대신 이지용(李址鎔)이 거절만 능사가 아니라며 조문 수정을 요구하자고 그럴듯한 의견을 내놓아 회의가 혼란에 빠졌고 폐하는 내전으로 들어가셨다.



이토가 다시 나타나 조약 체결을 강요했는데 나는 만민공론에 부치자는 이유로 기일을 연기함이 좋겠다는 생각에 폐하를 만나러 회의장을 빠져나왔으나 일본통역관에 의해 다시 이토에게 끌려갔다. 이토의 요구를 다시 거절했더니 일본사관들이 문을 지키고 나를 다음 날 오전 1시 반까지 수옥헌의 마루방에 가뒀다. 그 사이 외부대신이 도장을 찍어 줬다는 말을 듣고 통곡했다. 나는 외부대신이 동의해도 총리대신의 동의를 얻어 연서(連署)로 상주(上奏·왕에게 올림)해 재가를 얻지 않으면 무효임을 잘 알아 법부대신과 탁지부대신을 제하고 전부 면관시킬 수속을 했다. 그러나 그 이튿날부터 벌써 딴 세상이 됐다. 어전에서 소행이 도리에 어긋난다는 죄목이 붙어 내가 면관되고 3년의 유배를 보낸다는 칙명이 내려졌다.”

‘한말 정객의 회고담’이라는 제목으로 3회에 걸쳐 연재된 한규설의 증언은 이후 을사늑약이 강압에 의해 이뤄졌기 때문에 국제법상 무효라는 주장의 주요 근거가 됐다. 일제강점기에 한국 관련 소식을 일본에 전했던 ‘조선통신’은 한규설의 증언을 보도한 본보 기사를 그대로 일본어로 번역해 1930년 1월 14∼17일 보도했다. 최근 국내 한 신문은 조선통신의 이 기사를 인용해 ‘을사늑약이 일제의 강제에 의해 수행됐음을 거듭 입증하는 자료가 100년 만에 발굴됐다’고 1면 머리기사로 보도하기도 했다.

광복 후 을사늑약의 부당함에 대한 최초의 문제 제기는 유진오(兪鎭午) 전 고려대 총장이 1951년 7월 25일∼8월 1일에 본보에 연재한 ‘대일강화조약안의 재검토’ 기사였다. 이후 을사늑약에 대한 연구는 1992년 5월 서울대 이태진(李泰鎭) 교수가 을사늑약 원문에 조약의 명칭이 빠져 있고, 황제 비준에 관한 문서가 없음을 발견하면서 새로운 국면을 맞는다. 이어 1993년 10월 24일에는 미국 컬럼비아대 귀중본도서관에서 고종이 호머 B 헐버트를 통해 9개국 국가원수들에게 을사늑약이 원천 무효임을 알린 영문 친서가 발견됐다.

권재현 기자 confetti@donga.com

===========================================================

을사늑약은 무효다
일본의 강압을 입증하는 문서 공개


글:강동완 http://www.onekorea.info


1905년 11월에 체결된 제2차 한일협약 즉, 을사조약 체결 당시 일본측의 무력을 동원한 압력이 있었음을 입증하는 두 개의 보고서가 발견되었다.

하나는 당시 주한 미국 공사였던 에드윈 모건(Edwin Morgan)이 미국무장관 엘리후 루트(Elihu Root,)에게 보낸 보고서, 또 하나는 일본 육군의 전쟁 보고서다.

이 두개의 보고서는 12일 열렸던 한 심포지엄에서 일본 스루가다이(駿河台)대학 명예교수인 아라이 신이찌(荒井信一) 교수의 발표에 의해 밝혀졌다.

을사조약이 체결된 게 1905년 11월 17일이었으므로 몇일 있으면 꼭 100년이 된다. 일본에서는 제2차 한일협약으로 불리고 있지만, 일본이 한반도 식민지화를 목표로 대한제국의 외교권을 빼앗기 위해 힘을 동원해 강제로 맺은 굴욕적인 조약이라는 의미로 우리는 '을사늑약'으로 부르기도 한다.

사실 그동안 일본 정부는 이 조약의 강제성을 인정하지 않고, 법적 유효성을 주장해서 논란이 되고 있었다.

그런데 아라이 명예교수가 발굴한 자료인 1905년 11월20일 모건 주한 미국공사가 루트 국무장관에게 보낸 보고서에 당시의 상황이 잘 묘사되어 있다.

모건 주한 미국공사는 보고서에 "일본 특명 전권대사였던 이토 히로부미(伊藤博文)와 주한 일본군의 하세가와 요시미치(長谷川好道) 사령관이 함께 미 공사관으로부터 담 하나를 사이에 두고 20여 미터 떨어져 있는 회담장으로 들어갔다. 내부의 모습은 정확하게는 모르지만, 일본 헌병 등이 회의실의 베란다 및 하나 밖에 없는 뒷문 통로를 굳게 지키고 있는 것이 보였다"고 기록하고 있다.

또한 이 보고서에는 "헌병이 공식상으로는 이토 히로부미 등의 경호를 위해 배치되었다고는 하지만, 이는 대한제국 황제에게 일본의 요구를 거절하는 것은 적절치 못하다는 것을 인식시키기 위한 방편도 되었다"고 적고 있으며, 당시 서울 시내에서 있었던 일본군의 무력시위와 관련해서는 "물리적인 폭력이 행사되었다고 보기는 어렵지만 각료 등이 조약을 조인할 때 아주 자유로운 상태에서 했다고는 생각하지 않는다"는 내용도 기술되어 있다.

이 보고서는 미 외교관과 본국이 교환한 공식 문서를 모은 미국의 연구서「한미관계(Korean American Relations)」 제3권에 수록되어 있는 것을 아라이 명예 교수가 찾아낸 것이다.

역시 이와 같은 강압을 입증하는 일본 육군의 보고서도 발견이 되었는데, 「메이지 37년·38년 전쟁 육군 정사(明治三十七八年?役陸軍政史)」라는 보고서에 기록되어 있다.

이 보고서에 의하면 하세가와 요시미치 사령관은 조약에 반대하는 대한제국 각료들의 움직임을 사전에 차단하기 위해 헌병을 동원해서 동정을 감시했다고 한다. 또한 대한제국의 군부 대신을 불러 "최후의 수단이 무엇인지에 대해서는 상세히 말하지 않겠는데…"라며 몇 마디 말로 협박하자 무서워 벌벌 떨며 자리에서 일어섰다는 내용도 적혀 있다.

그리고 서울에 보병부대나 포병대대 등을 배치한 목적을 치안유지 외에 각료의 도주 방지와 시위진압을 들고 있다.

아라이 명예교수는 이와 같은 일본측의 행위는 '사실상의 감금'에 다름없는 행위였고, '권총을 들이댄 것과 같다'라며 을사조약의 무효성을 지적했다.