728x90

Question

MustGather information for problems with down dbspaces/chunks. Gathering this information before calling IBM® support helps familiarize you with the troubleshooting process and saves you time.

Answer

Gathering general information

For IBM® Informix® products, gather the following information for any problem:

MustGather: General Information to collect for Informix Family product problems



Down DBSpace / Chunk information 



Processes to run

Read the operating system man pages and IDS documentation for usage and other information about the following commands, if necessary. Run the following commands and collect the output:


Files to collect

This section lists files to collect which are normally (or optimally) analyzed for this problem.


Submitting information to IBM Support 

Once you have collected your information, you can begin Problem Determination through the product Support web page, or simply submit the diagnostic information to IBM support.

You can submit files using one of following methods to help speed problem diagnosis:

See the Related information article, 
Submitting diagnostic information to IBM Technical Support for problem determination

http://www-01.ibm.com/support/docview.wss?uid=swg21270737

728x90
728x90
1. onstat -d 명령으로 dbspace 확인
$ onstat –d
 
Informix Dynamic Server Version 7.31.UD1    -- on-Line -- Up 16 days 05:57:23 -- 163008 Kbytes
 
Dbspaces
address  number   flags    fchunk   nchunk  flags    owner    name
1219a150 1        2        1        1        M        informix rootdbs
1219ad00 2        1        2        4        N        informix datadbs
1219adc0 3        1        5        1        N        informix datadbs2
1219ae80 4        1        7        3        N        informix datadbs3
4 active, 2047 maximum
 
Chunks
address  chk/dbs offset   size     free     bpages   flags pathname
1219a210 1   1   50       1000000  748319            PO-   /opt/informix/DBS/root_chk01
1219a310 1   1   50       1000000  0                 MO-   /opt/informix/DBS/mroot_chk01
1219a500 2   2   50       1000000  3                 PO-   /opt/informix/DBS/datadbs_chk01
1219a600 3   2   50       1000000  51                PO-   /opt/informix/DBS/datadbs_chk02
1219a700 4   2   50       1000000  957               PO-   /opt/informix/DBS/datadbs_chk03
1219a800 5   3   50       1000000  999947            PO-   /opt/informix/DBS/datadbs2_chk01
1219a900 6   2   50       1000000  615765            PO-   /opt/informix/DBS/datadbs_chk04
1219aa00 7   4   50       1000000  99947             PO-   /opt/informix/DBS/datadbs3_chk01
1219ab00 8   4   50       1000000  0                 PD-   /opt/informix/DBS/datadbs3_chk02
1219ac00 9   4   50       1000000  0                 PD-   /opt/informix/DBS/datadbs3_chk03
9 active, 2047 maximum
2. flags 두번째 값 확인. 'D'로 표시된 경우 Chunk Down 을 의미함.
3. Chunk가 raw-device 인지, cooked-file 인지 확인.
4. symbolic link 및 chunk에 문제가 없는지 dd 명령어등으로 액세스 가능 여부 확인.
5. mirror chunk 가 존재한다면 onspaces 명령으로 온라인 전환 가능.
onspaces -s db_acct -p /dev/mirror_chk1 -o 0 -O
6. 위의 경우로 해결할 수 없을 때는 onall 등의 유틸리티로 복구

 

* onall은 IBM에서 제공하는 인포믹스 복구용 프로그램입니다.

최신 또는 11 버전 이상의 버전에 대해서는 별도로 제공되지 않으며 IBM의 기술지원을 받아야 합니다.

 

* 11 버전 이상에서는 ASTOOL(Advanced Support tools)을 사용해 인포믹스 복구를 시도할 수 있습니다.다만 사용하기 위해서는 별도의 key generator가 필요하며 IBM에서만 제공됩니다.

728x90
728x90

Oracle 에서 Informix 로 Porting 하는 가이드

A Discussion of the Application Porting Issues
Informix Dynamic Server Version 7.3x

CHAP 1. 소개

CHAP 2. DDL

2.1 식별자(Identifiers)

식별자는 데이터베이스, 테이블, 컬럼, 인덱스, 뷰, 프로시저 등의 데이터베이스 오브젝트를 나타내는 이름이다.

2.2 데이터베이스 (Databases)

※ ANSI 데이터베이스의 특징
트랜잭션이 암시적(implicitly)으로 정의되므로 begin work 문장이 필요없이 모든 문장이 트랜잭션안에 들어간다.
데이터베이스의 모든 오브젝트는 소유자(owner)의 이름을 필요로 한다.
Grant to public 개념이 없으므로 각각의 사용자에게 권한을 부여해야 한다.

2.3 테이블 (Tables)

※ constraint 정의 구문 예제

※ Informix의 alter table 구문은 좀 더 풍부한 기능을 제공한다
- 컬럼 추가 및 삭제, 컬럼명 변경, next size변경, lock mode변경 등

2.4 자료형 (Data types)

※ NULL , 공백 문자열
오라클의 빈(empty) varchar 컬럼은 null로 간주한다.
공백이 들어간 문자열의 비교에서 오라클을 공백을 문자열 간주하고 인포믹스는 공백을 무시한다, 즉 오라클은 "abc" != "abc " 이고, 인포믹스는 "abc" = "abc " 이다.

2.5시퀀스 (Sequences)

2.6 인덱스 (Indexes)

2.7 뷰 (Views)

2.8 스토어드 프로시저 (Stored Procedures)

2.9 오라클 확장형 (oracle extensions)

CHAP 3. DML

3.1 SQL

3.1.1 selects
데이터를 읽어오는데 가장 적합한 방법을 옵티마이저가 어떻게 결정하느냐에 의해 질의가 실행 된다. 오라클과 인포믹스 7.3버전 이후 서버는 select문에서 옵티마이저 힌트를 사용할 수 있다.

3.1.2 Optimizer Directives
인포믹스 7.3이후 부터 오라클과 흡사한 옵티마이저 지시자(directives)를 제공한다.
질의가 수행될 때의 첫번째단계는 질의에 대한 최적화 경로를 찾아 컴파일하고 두번째 단계로 결과값을 출력한다.

인포믹스의 옵티마이저 지시자는 오라클의 옵티마이저 힌트와 구문과 동작에서 호환성이 있다.
지시자는 '+'기호가 따라오는 주석(comment)안에서 사용된다.
예)
select {+ ORDERED AVOID FULL(e)} * from employee e, department d 
where e.dept_no = d.dept_no;

오라클의 직접적인 힌트외에 인포믹스는 유일하게 negative directives 의 개념을 제공한다. 즉, 옵티마이저가 피하는 (avoid) 최적화 방법을 지시할 수 있다. 또한 set explain 의 출력결과에서 옵티마이저 지시자에 대한 모든 정보를 알 수 있어 지시어의 의미 또는 구문 에러를 표시할 수 있다.

옵티마이저 지시자는 다음과 같은 최적화 프로세스를 제어할 수 있다
· Access methods: 인덱스 또는 전체 스캔.
· Join Methods: hash join 또는 nested loop joins.
· Join Order: 지정한 테이블 순서에 의해 join
· Goal: first rows 또는 all rows (최초 응답시간 대 전체 산출 결과).

3.1.3 Inserts
INSERT INTO…SELECT 구문을 사용할 때 인포믹스는 select절에 union 을 사용할 수 없고, INSERT INTO…VALUES 에서 수식이나 select절을 사용할 수 없다. 이러한 경우 select에 대한 결과를 INTO TEMP 절을 사용하여 임시테이블을 생성하고, INSERT INTO…SELECT 절 구문을 임시테이블로 부터 읽어와서 입력하도록 재작성해야한다.

3.1.4 Deletes

오라클의 DELETE table_name 구문은 DELETE FROM table_name 구문으로 고쳐야한다

3.1.5 Temporary Tables
인포믹스와 오라클의 temporary table은 개념에 있어서 많이 다르다. 
오라클의 temporary table은 하나의 필드를 포함하는 배열과 같이 구현되어 있다.
인포믹스의 temporary table은 일반 테이블과 동일하게 구현되어 생성, 변경, 삭제 등의 작업을 할 수 있지만, 세션안에서만 유효하다.

3.1.6 Joins
오라클의 outer join 구문 + (조인 테이블의 컬럼에 부합하지 않는 값을 가진 컬럼의 뒤에 붙는다) 는 인포믹스의 OUTER 구문과 동일하다. OUTER 키워드는 테이블명 앞에 붙는다. 오라클과는 달리 괄호로 그룹화되어 복합(multiple) outer join을 허용한다.

오라클의 INTERSECT와 MINUS 오퍼레이터는 UNION과 비슷하다. INTERSECT는 인포믹스에서 WHERE EXISTS 나 WHERE … IN으로 교체할 수 있고, MINUS는 WHERE NOT EXISTS 또는 WHERE … NOT IN으로 교체할 수 있다.

인포믹스의 UNION은 대응되는 select 리스트의 자료형이 일치해야한다. 
만약 그렇지 않을 경우 컬럼 리스트를 변경하거나 자료형을 바꿔야한다.

3.1.7 Order by, Group by
인포믹스에서는 ORDER BY절 또는 GROUP BY절에 사용하는 컬럼 리스트가 반드시 select리스트에 나타나야 한다.

3.1.8 Sorts
오라클에서의 NULL값을 가장 높은 값이고 인포믹스에서는 가장 낮은 값이다. 
그러므로 오름차순으로 정렬을 할 경우 인포믹스에서는 NULL값이 먼저 출력된다.
이를 오라클과 동일한 순서로 변형시키기 위해서는 NULL값을 가장 높은 값으로 만들어 정렬할 수 있도록 stored procedure를 작성하고, 정렬이 끝나고 출력될 때 다시 NULL으로 교체하도록 하여야 한다.

3.1.9 Exceptions
하드 코딩된 오라클의 에러코드 값은 인포믹스의 에러 코드 값으로 교체해야한다.

3.1.10 Correlation Names
UPDATE나 DELETE의 메인 테이블에 대해 correlation name을 사용할 수 없다.

3.1.11 Aliases
테이블에 alias 를 주면 원본 테이블명을 select 리스트나 where절에서 사용할 수 없다.

3.1.12 Hierarchical Queries
인포믹스는 B-트리 형태의 계층적으로 구성된 질의 결과를 만들지 않는다.
오라클은 START WITH 와 CONNECT BY PRIOR 절을 사용하여 구현한다.
START WITH 는 루트 노드의 행을 지정하고, CONNECT BY에서 부모 노드와 자식 노드의 관계를 서술 한다. 이때 PRIOR 수식을 가장 먼저 확인한다.

다음 예는 JOB이 PRESIDENT인 직원을 루트 노드로 하여 그 아래 모든 하위 노드를 출력하는 질의어이다.

SELECT ename, empno,
              mgr, job 
FROM emp 
START WITH 
job = 'PRESIDENT' 
CONNECT BY PRIOR 
empno = mgr

오른쪽 테이블은 위의 질의 결과를 도식화하여 나타낸 것이다. 위와 같은 기능을 인포믹스에서 사용하려면 stored procedure나 function을 작성하여 cursor 또는 array를이용해야 한다. 인포믹스의 global array가 도움이 될 것이다.

3.2 호스트 변수 (Host Variables)

데이터 형에 따라 호스트 변수의 포맷을 변경할 필요가 있을 수 있다. 
예를 들어 number나 date같은 자료형은 인포믹스에서 동일한 포맷으로 지원되지 않으므로 SQL문장안에서 포맷을 정의하는 절차를 거쳐야 한다.

예를들어 오라클 함수 TO_CHAR는 날짜와 숫자 값의 포맷을 사용한다. 
비슷한 방식으로 인포믹스는 7.3 버전 이후 TO_DATE와 TO_CHAR 함수를 추가하였다. 
또한 ESQL/C에서는 오라클의 날짜 포맷에 대응하여 인포믹스 날짜 포맷을 출력하는 ifx_to_gl_datetime() 함수를 가지고 있다.

위의 경우 포맷은 인포믹스에서 제공하는 값을 사용해야하며 오라클의 모든 포맷을 반 드시 포함하고 있는것은 아니다.

3.3 날짜 및 시간 함수 (Date and Time Functions )

현재 날짜를 처리하기 위하여 오라클은 SYSDATE를 사용하는데, 인포믹스에서는 다음과 같이 자료형에 따라 다르게 표현한다.

SQL문으로 현재 시스템 날짜를 얻기 위하여 SELECT DISTINCT TODAY FROM SYSTABLES 
와 같이 사용한다. 또한 ESQL/COBOL의 ECO_TDY()함수나 ESQL/C의 rfmtdate()함수에서도 제공된다.

인포믹스의 날짜 처리 형태로 변환해야할 오라클 함수

· ADD_MONTHS(date,months), 
· LAST_DAY(date)
· MONTHS_BETWEEN(date1, date2)
· NEW_TIME(date,current_timezone,new_timezone)
· NEXT_DAY(date,char)
· ROUND(date,format)
· SYSDATE
· TRUNC(date,format)

오라클의 TO_CHAR, TO_NUMBER, TO_DATE 함수에 대한 포맷은 다음 표를 참조한다.

3.3.1 number format

3.3.2 date format

3.3.3 RR format
RR 포맷을 YY 포맷과 유사하지만 서로 다른 세기(century)의 날짜값을 구분하기 위하여 사용한다

3.4 집계 함수 (Aggregagte Functions )

3.5 수학 함수 (Mathematical Functions )

인포믹스는 오라클의 수학함수 CEIL, FLOOR, SIGN, COSH, SINH, TANH를 지원하지 않는다. ROUND함수에서 round factor -32 에서 32까지의 값을 사용할 수 있다.

3.6 스트링 함수 (String Functions)

3.7 기타 오라클 함수

인포믹스는 다음과 같은 오라클 함수를 지원하지 않는다.

· CHARTOROWID 
· CONVERT
· DUMP 
· GREATEST 
· GREATEST_LB 
· HEXTORAW 
· LEAST 
· LEAST_UB 
· RAWTOHEX 
· ROWIDTOCHAR 
· TO_LABEL 
· TO_MULTI_BYTE 
· TO_SINGLE_BYTE 
· UID 
· USER 
· USERENV(OSDBA/ LABEL/ LANGUAGE/ TERMINAL/ SESSIONID/ ENTRYID) 
· VSIZE

3.8 매크로(Macros)

인포믹스는 오라클의 macro를 지원하지 않으므로 코드에서 제거해야하고 관련된 로직은 인포믹스에서 동일하게 구현될 수 있다.

3.9 Pseudo-Columns

Pseudo-columns 은 테이블에는 존재하지만 SELECT * FROM table_name 과 같은 질의에서는 나타나지 않는 컬럼이다. 인포믹스에서 pseudo-column은 일반적으로 DBMS엔진에 의해 사용되므로 이러한 컬럼을 어플리케이션에서 직접적으로 사용하지 않는것이 향후 어플리케이션 이식성이나 어플리케이션 변경에 도움이 된다.

3.9.1 LEVEL 
오라클에서 hierarchical query를 할때 pseudo-column LEVEL 은 루트노드에 대하여 1을 리턴하고 그 루트노드의 자식 노드는 2를 노드 2가 부모인 자식 노드는 3을 등등.. 이러한 형태로 출력된다. 
질의에서 hierarchical 관계를 정의하려면 START WITH CONNECT BY 문을 사용한다. 
인포믹스는 hierarchical 질의를 지원하지 않으므로 LEVEL 컬럼을 사용하지 않는다.

3.9.2 ROWID 
오라클의 ROWID 컬럼은 각 데이터 행의 주소를 나타낸다. 
출력되는 ROWID는 다음과 같은 정보를 가지고 있다.

· 데이터파일에서 데이터 블럭의 정보 
· 데이터블럭에서의 행의 정보 (첫번째 행이 0) 
· 데이터파일 정보 (첫번째 파일이 1)

대부분 데이터베이스에서 한 행을 나타내는 ROWID는 유일한 값을 가지지만 서로 다른 테이블에서 동일한 클러스터안에 저장된 행은 동일한 ROWID를 가진다. 
ROWID 컬럼의 값은 오라클의 ROWID 자료형으로 저장된다.

ROWID는 새로 지워지고 새로 입력되면 새로운 값이 할당되므로 이 컬럼을 테이블의 primary key로 사용하지 말아야 한다. 또, ROWID 컬럼값은 입력,수정,삭제 될 수 없다.

SELECT ROWID, ename 
FROM emp 
WHERE deptno = 20

오라클의 ROWID는 인포믹스의 ROWID와 거의 동일하게 동작한다. 하지만 저장되는 
자료형은 서로 다르다.

3.9.3 ROWNUM 
오라클에서 ROWNUM 컬럼값은 선택된 결과 레코드의 순서를 나타낸다. 
다음과 같은 질의는 첫번째 9개 행을 출력한다.

SELECT * FROM emp WHERE ROWNUM < 10

이런 ROWNUM을 이용하여 테이블의 각 행에 유일한 값을 할당할 수 있다.

UPDATE tabx SET col1 = ROWNUM

오라클은 각 행을 읽어온후 ROWNUM을 할당하고 ORDER BY절에 의해 정렬되므로 ORDER BY에 의한 순서와 ROWNUM 순서가 다를 수 있다. 그러나 ORDER BY절에 사용되는 컬럼이 인덱스를 사용한다면 순서가 같아진다. 다음과 같은 질의는 아무런 행도 리턴하지 않는다.

SELECT * FROM employee WHERE ROWNUM > 1

첫번째 행을 가져와서 ROWNUM을 1로 할당하므로 조건에 맞지 않아 출력되지 않는다. 
두번째 행이 출력되기 위해서는 ROWNUM이 1로 다시 할당되는 이때도 조건에 맞지 않기 때문에 출력되지 않고 이후의 모든 행이 마찬가지 상태가 된다.

인포믹스는 ROWNU과 동일한 컬럼을 가지고 있지는 않지만 FIRST N 구문을 이용하여 구현할 수 있다.

인포믹스는 다음과 같은 복합적인 경우에는 사용할 수 없다.

· subqueries 
· into temp 문 
· view 정의 
· stored procedure 
· union 질의

ORDER BY 없이 FIRST N구문을 사용하면 의미없는 순서로 데이터가 출력될 것이다.

/* 월급이 가장 많은 10명을 출력 */ 
SELECT FIRST 10 name, salary FROM emp ORDER BY salary; 
/* 10개의 최고 월급 출력 */ 
SELECT FIRST 10 DISTINCT salary FROM emp ORDER BY salary;

인포믹스 7.3은 "FIRST"란 이름으로 컬럼명을 사용할 수 있다. 따라서 "FIRST" 뒤에 양의 정수가 따라 오지 않는 경우는 테이블의 컬럼명으로 생각한다. 
N값은 1에서 231 - 1 까지 사용할 수 있다.

UPDATE tabx SET col1 = ROWNUM

위와 같은 오라클의 ROWNUM을 할당하는 구문의 경우 ESQL/C 로 아래와 같이 구현한다.

int counter = 0;
EXEC SQL declare c1 cursor for
	SELECT col1, col2 
	  INTO :col1, :col2 
	  FROM table 1 
	 WHERE col1 = "XX";
EXEC SQL open c1;
while (SQLCODE == 0) {
	EXEC SQL fetch c1;
	counter++;  /* Increment counter for each row fetched */
	if (counter >= 5)	{
		break;
		/* logic... */
	}  /* End if */
}  /* End while */

3.10 커서를 이용한 수정 (Update Using Cursors )

인포믹스와 오라클의 커서는 약간의 차이가 있다. 
오라클과는 달리 인포믹스에서는 FOR UPDATE 커서가 여러 테이블을 조인하는 경우에는 사용할 수 없으므로 WHER CURRENT OF 문장을 테이블 조인상태에서 사용할 수 없다. 
따라서 테이블을 조인해야할 경우는 동일한 커서 루프에서 WHERE CURRENT OF 문장을 제거하고 UPDATE문장을 분리하여야 한다.

인포믹스에서 commit 또는 rollback 문은 트랜잭션안에서오픈된 모든 커서를 닫는다. 
커서를 닫지 않고 commit 또는 rollback을 실행하여야 할 경우 HOLD 커서를 선언할 수 있다. 그러나 HOLD커서는 FOR UPDATE 문에서 사용될 수 없다. 
따라서 오라클에서 fetch 루프안에서 업데이트하거나 commit하는 어플리케이션은 인포믹스의 형태로 변환해야한다. 커서는 HOLD를 사용하여 선언하고 업데이트 문장은 WHERE CURRENT OF 문장 없이 사용한다. WHERE CURRENT OF 문장의 의미를 나타내기 위하여

WHERE ROWID = fetch된 rowid값 또는 
WHERE primary key 컬럼 = fetch된 primary key 컬럼값

형태로 작성한다.

오라클의 트랜잭션 내의 fetch 루프를 구현하기 위하여 BEGIN WORK 문장이 COMMIT WORK 나 ROLLBACK WORK 문장에 바로 따라 올 수 있도록 한다.

3.11 시스템 테이블(System Tables )

오라클의 시스템 테이블 참조는 이에 대응되는 인포믹스의 시스템 카타로그 테이블 차조로 교체할 수 있다.

3.12 스토어드 프로시저 (Stored Procedures)

3.12.1 Size 
인포믹스의 stored procedure는 대략 64K의 한계가 있다. 
오라클의 64K가 넘는 procedure는 좀더 작은 단위로 쪼개고 필요한 매개변수와 리턴값을 서로 주고 받을 수 있도록 한다.

3.12.2 Packages 
오라클의 stored function과 stored procedure는 인포믹스의 stored procedure로 교체할 수 있다. 그러나Package body는 stored procedure와 stored function의 그룹을 포함하고 있고 package는 stored procedure와 stored function의 리스트를 가지고 있다. 
모든 package body는 인포믹스의 개별적인 stored procedure로 재작성해야 하고 package 레벨의 변수는 인포믹스의 global 변수로 대응시켜야 한다.

3.12.3 Exceptions
오라클은 CURSOR_ALREADY_OPEN, NO_DATA_FOUND, ZERO_DIVIDE 등과 같이 미리 정의되거나 사용자 정의된 exception label을 가지고 있다. 
EXCEPTION 구조를 사용한 BEGIN/END 블럭에서 하나의 exception 만 허용되고 보통 END 문 바로 앞에 EXCEPTION 처리문이 위치 한다.

인포믹스 또한 미리 정의되거나 사용자가 정의한 exception을 지원하지만 표현 방식이 label형태가 아니고 숫자로 나타난다. 모든 exception은 stored procedure의 control block에서 체크되고, 각 control block의 상단부에 EXCEPTION문으로 명시적으로 선언해야한다.

오라클에서는 exception 처리가 global하게 처리된다. 
인포믹스에서는 블럭단위로 exception처리가 제한된다.

3.12.4 Error Handling 
SQLCA 구조체는 stored procedure에서 완벽하게 지원하지 않는다. SQLCODE 변수 체크는 불가능하다. 대신 DBINFO 함수를 사용해 sqlca.sqlerrd1과 sqlca.sqlerrd2 값을 추출해 낼 수 있다. 이 함수는 커서가 열린FOREACH 문안에서 사용될 수 있다.

3.12.5 Cursors
오라클의 global 커서는 인포믹스에서 temporary 테이블을 통하여 구현한다.
오라클 procedure에서는 커서를 명시적으로 선언하고 오픈하지만 인포믹스에서는 procedure안에서 명시적으로 커서를 선언할 필요 없다. 따라서 오라클의 procedure 커서는 인포믹스의 FOREACH 구조로 변환할 수 있다.

3.12.6 Flow Control
오라클에서는 GOTO 와 EXIT 

3.12.7 Variable Declaration and Assignment
오라클은 FOR 루프안에서 암시적(implicit) 변수 선언이 가능하다.

Out_customer_name := customer.name;

위의 out_customer_name은 customer테이블의 name 컬럼과 동일한 자료형을 가진다

인포믹스는 각각의 control block 상단에 모든 변수를 선언해야한다.

DEFINE out_customer_name LIKE customer.name;
DEFINE counter INTEGER;

따라서 오라클의 암시적 변수 선언은 인포믹스에서 control block 앞에 명시적(explicit) 변수 선언으로, 오라클의 할당 연산자 := 은 LET 키워드와 등호(=) 표시로 교체해야 한다.

3.12.8 Boolean
오라클의 BOOLEAN 자료형 변수는 char(1) 또는 정수형의 변수로 교체하고 프로그램적으로 제어하도록 한다.

3.12.9 Binary Data Types
오라클에서 binary형은 RAW로 사용하고 선언부에서 명시적으로 최대 길이를 정의한다. 
인포믹스에서는 REFERENCES BYTE 로 선언하고 단지 BLOB에 대한 포인터만을 관리한다.

3.12.10 Dynamic SQL
인포믹스에서는 procedure안에서 dynamic SQL을 지원하지 않는다. 이러한 종류의 처리는 ESQL/C 프로그램을 통하여 구현할 수 있다.

3.12.11 Compiler
오라클과는 달리 인포믹스의 procedure 컴파일러는 데이터베이스와 독립적으로 procedure를 생성할 수 있도록 하므로 컴파일단계에서는 에러가 상대적으로 적고 메시지가 상세하지 않지만 실행단계에서 데이터베이스 오브젝트의 유효 여부를 판단한다.

3.13 트리거 (Triggers)
오라클은 하나의 트리거에서 동시에 여러 이벤트 (insert, update, delete 등)를 처리할 수 있다. 
인포믹스는 하나의 트리거에서는 오직 하나의 이벤트만을 처리한다.

인포믹스는 오라클에 없는 몇가지 constraint를 제공하는데, EXECUTE PROCEDURE … INTO 구문을 사용하여 트리거가 insert나 update 이벤트 발생시 단지 한 행이나 한 컬럼에 대해서만 영향을 미치도록 할 수 있다.

인포믹스 7.3 이전에는 INSERT나 UPDATE 이벤트나 발생했을 때 트리거를 발생시키는 컬럼에 변경을 줄 수 없었다. 인포믹스 7.3버전 이후 reentrant UPDATE / INSERT 트리거의 기능이 EXECUTE PROCEDURE … INTO 구문을 통해 가능해졌고 이러한 기능으로 동일한 트리거 또는 다른 트리거를 cascade 하게 부르지 못하게 할 수 있다.

다음 예는 reentrant UPDATE / INSERT 트리거의 예이다.

create table foo (
      x int default NULL,
      y int default NULL,
      z int default NULL
);
create procedure reentrant()
	returning int;
	return 56;
end procedure;
create trigger reentrant_trigger insert on foo for each row (
execute procedure reentrant() into z
);
insert into foo values (1, 2, 3);
select * from foo;
x           y           z
1           2          56

오라클에서는 트리거의 본문에 SQL문과 stored procedure, 그리고 logical statement를 사용할 수 있다. 인포믹스는 stored procedure와 SQL문만이 가능하므로 logical statement는 procedure 안으로 옮겨 넣어야 한다.

3.14 Constraints
오라클과 인포믹스는 트랜잭션 안에서 constraint를 enable 또는 disable 시킬 수 있다. 차이점이 있다면 오라클 어플리케이션은 항상 트랜잭션을 사용하고 있고 인포믹스는 명시적으로 지정한 위치에서 트랜잭션을 사용하도록 되어 있다.
다음 constraint 구문은 인포믹스에서 사용가능하다

SET {CONSTRAINTS/INDEXES/TRIGGERS} FOR table_name {ENABLED/DISABLED}
SET CONSTRAINTS comma_separated_constraint_names {ENABLED/DISABLED}
SET INDEXES comma_separated_index_names {ENABLED/DISABLED}
SET TRIGGERS comma_triggers_constraint_names {ENABLED/DISABLED}
SET CONSTRAINTS {ALL/constraint_name} {IMMEDIATE/DEFERRED}

마지막 문장은 DBA권한이 없는 일반 사용자가 사용할 수 있는데, DEFERRED절을 사용하면 모든 constraint 위반 사항을 트랜잭션이 commit되거나 rollback되는 시점에 검사한다.

3.15 DUAL TABLE
오라클의 DUAL 테이블은 dummy 컬럼을 한 행 가지고 있는 시스템 테이블이다.
주로 다음과 같은 경우에 사용된다.

어떠한 상수값을 가져와서 호스트 변수에 저장할 때

SELECT TO_CHAR(SYSDATE) INTO :date_var FROM DUAL;

어떠한 변수값을 다른 변수에 할당할 때

SELECT TO_CHAR(SYSDATE) INTO :date_var FROM DUAL;

호스트 변수값과 일반 질의의 결과를 union할 때

SELECT col1, col2, col3 FROM table_name
UNION
SELECT :host_var1, :host_var2, :host_var3 FROM DUAL;

DUAL 테이블을 변환하는 방법은 DUAL 테이블의 용도에 따라 여러 방법이 있다.
단지 상수값을 할당하는 문장은 인포믹스의 변수값 할당 문장으로 교체할 수 있고 좀 더 복잡하게 사용하는 경우 DUAL 이란 이름으로 temporary 테이블을 만들어 사용할 수 있다.

CHAP 4. Embedded SQL

오라클의 embedded SQL 제품은 Pro*C, Pro*COBOL 이고 이와 관련된 인포믹스 제품은 ESQL/C, ESQL/COBOL이다.

4.1 호스트 변수 (Host Variables)

4.1.1 Declaration Override

4.1.2 Arrays
오라클에서는 배열 변수에 값을 할당하기 위하여 SQL문의 루프에서 배열처리를 할 필요가 없지만 인포믹스에서는 fetch 루프가 필요하다.

4.1.3 Formatting 
인포믹스에서 DECIMAL, MONEY, DATE, 또는 DATETIME 값을 읽어 호스트 변수에 넣을 때 출력할 포맷을 지정하는 과정을 거친다.

…
dec_t	dec_host_var;
char	formatted_dec[40];
EXEC SQL SELECT DEC_COLUMN INTO :dec_host_var FROM TABLE_NAME;
rfmtdec(&dec_host_var, "&&&&&&&.&&&", formatted_dec);
printf("The Decimal Value is %s\n", formatted_dec);
…

4.2 SQL구조체 (SQL Structures)

4.2.1 SQLCA

오라클 에러 메시지를 얻기 위하여 대개 SQLCA요소 중 SQLERRMC를 이용한다. 인포믹스에는 SQLERRM은 같은 기능을 하고HP와 Solaris에서는 SQLERRM대신rgetmsg 함수를 사용할 수도 있다.

4.2.2 SQLDA
오라클의 SQLDA구조는 인포믹스와 상당히 많이 다르다. 오라클의 SSQLALD 함수는 인포믹스의 ALLOCATE DESCRIPTOR문으로 변경되야 하는 등 많은 부분 변경이 필요하다.

만약 오라클 어플리케이션이 SQLDA 구조체를 직접 사용하지 않고 simple dynamic SQL 메소드를 사용했다면 indicators/placehoder는 인포믹스에서 '?로 교체할 수 있다.

4.2.3 ORACA
오라클의 ORACA구조체는 인포믹스에서 지원하지 않는다. 이 구조체는 오라클에서만 특정부분 사용되므로 어플리케이션에서 제거하여야 한다.

4.3 Pre-Compiler Options

어플리케이션에서 EXEC ORACLE OPTION문으로 시작되는 오라클 옵션은 제거한다. 이 문장은 성능과 관련될 수 있는 내용이므로 어플리케이션 로직에 영향을 미치지 않는다.

4.4 Embedded PL/SQL

오라클에서는Pro*C나 Pro*COBOL 코드 안에 프로시저 PL/SQL을 EXEC SQL EXECUTE와 END-EXEC 문 사이에서 포함할 수 있다. 인포믹스에서는 이러한 블럭을 동일한 기능을 하는 ESQL/C나 ESQL/COBOL코드로 변환해야 한다.

4.5 ODBC

Oracle Call Interface(OCI)를 사용하여 작성된 어플리케이션은 인포믹스의 Call Level Interface (CLI)로 재 작성해야 한다.

4.5.1 Database Library Calls
오라클의 OCI와 인포믹스 CLI의 가장 큰 차이점은 전체적인 데이터구조와 데이터베이스 라이브러리 호출을 처리하는데 사용되는 메카니즘이다.
오라클은 데이터베이스 서버로 direct connection을 사용하고 인포믹스는 ODBC connection을 사용한다.

4.5.2 Global Area Processing
또다른 차이점으로 세개의 global 영역을 가리키는 pointer 사용에 있다.
오라클이 사용하고 있는HAD (Handle Data Area), LDA (Logon Data Area), CDA (Cursor Data Area 포인터는 인포믹스에서HENV (Environment Area), HDBC (Database Connection Area), HSTMT (Statement Area) 포인터로 변환해야 한다.

4.5.3 Fetch cycle
오라클의 fetch cycle은 커서 데이터 영역안에서parsing, binding, defining, fetching executing 단계를 거치는데, 인포믹스는 "for each" 안에서 preparing, binding, executing, binding, fetching 단계를 가진다.

4.5.4 Raw Binary Data Type Processing
오라클의 RAW 바이너리 자료형은 pointer-to-BLOB REFERENCES BYTE 형으로 고쳐야 한다.

4.5.5 Parameter Binding
오라클에서 파라매터의 muliple output binding은 ODEFIN() 호출에서 OUTPUT 형으로 선언된다. 인포믹스에서는 SQLBindCol() 호출로 변환한다.
오라클과 인포믹스에서 input/output binding에 차이가 있는데, 오라클에서는 ODEFIN() 호출안에서 INPUT/OUTPUT 형으로 선언한다. 인포믹스에서는A=B, B=C, C=A 처럼 세개의 변수를 사용하여 라운드로빈 형태로 접근한다.

4.6 Embedded SQL for C

4.6.1 VARCHAR
오라클 Pro*C의 VARCHAR 자료형은 프리컴파일 이후 두 개의 요소, 즉 unsigned short len 과 unsigned char arr[size]로 나뉘어진다. 
인포믹스에서는 VARCHAR 형은 C의 CHAR와 동일하다.

4.6.2 Host Variables
오라클의 EXEC SQL TYPE은 C언어의 typedef 와 같다.

4.7 Embedded SQL for COBOL

4.7.1 VARCHAR
Pro*COBOL의 VARYING 절은 프리컴파일 이후 variable-name-LEN PIC S9(4) COMP 와 variable-name-ARR PIC X(size)로 확장된다. 
인포믹스에서는 이러한 개념을 지원하지 않으므로 variable-name-LEN 은 모두 제거하고variable-name-ARR 은 variable-name 으로 수정하며VARYING 절도 제거해야 한다.

4.7.2 Level 88
인포믹스 ESQL/COBOL 7.2 이후 부터 호스트 변수 선언부안에서 COBOL level 88의 기능을 지원한다

4.7.3 SQLDA
ESQL/COBOL 에서는 SQLDA 구조체가 허용 되지 않는다. SQLDA 데이터를 다루기 위해서는 ALLOCATE DESCRIPTOR, DESCRIBE, GET DESCRIPTOR, SET DESCRIPTOR 같은 인포믹스 매크로를 사용해야 한다.

4.7.4 REDEFINDES
인포믹스 ESQL/COBOL 7.2 이후 부터 REDEFINES 구문을 지원한다.

4.7.5 Tips
프리컴파일 할 때IF [ELSE IF … ] END-IF 또는 EVALUATE END-EVALUATE 또는 PERFORM END-PERFORM 블럭안에서 SQL문장을 만나면 SQL 문장뒤에 마침표가 있는지 상관하지 않고 생성된 COBOL 문장뒤에 마침표(period)를 찍는다. 이러한 동작은 COBOL 규칙에 어긋나 구문에러를 발생시킨다. 이런 문제를 피하기 위해 각각의 SQL 문장은 새로운 문단으로 이동시켜서 그룹화 한 뒤 수행되도록 한다.

CHAP 5. Application Architecture

5.1 트랜잭션 처리 (Transaction Processing)

다음 예에서ws-dbenviron 은 데이터베이스 이름, ws-connect-nm 은 사용자 이름ws-identity-nm 은 패스워드enp 와 connection-name 은 연결(connection) 이름이다.

5.1.1 Simple Connect

5.1.2 Named Connect with Literal

5.1.3 Named Connect 

5.1.4 Savepoints 
오라클은 PL/SQL안에서 savepoint는 허용한다. PL/SQL 블럭안에서 COMMIT 또는 ROLLBACK을 SAVEPOINT A, SAVEPOINT B.. 등으로 표시한 곳까지의 범위에 한정시킬 수 있다. 이러한 savepoint는 stored procedure와 같이 생각될 수 있는데, 전체 트랜잭션에 영향없이 호출한 procedure만 실행되던지(commit) 아니면 실패(rollback)될 수 있다. 
인포믹스는 stored procedure 안에서 savepoint 기능을 지원하지 않는다.

5.2 일관성 (Concurrency)

5.3 사용자 인증 (User Authentication)

CHAP 6. Environment

6.1 스크립트 (Scripts)

오라클에서는 '&'가 붙는 치환(substitution) 변수를 사용자 정의할 수 있다. 명령어 중에서 치환변수를 만나면 변수 자체가 아닌 변수에 값을 대입하여 실행하게 된다.
이러한 치환변수는 SQL이나 SQL*Plus 명령 어느 곳에서도 사용될 수 있다.
SQL*Plus에서 값이 정의 되지 않은 치환 변수를 만나면 값이 입력되기를 기다린다.
인포믹스의 dbaccess는 이러한 기능을 제공하지는 않지만, 쉘 스크립트를 이용하여 변수 치환을 할 수 있다.

위의 예제 스크립트에서는 decode 파일에 두가지 컬럼을 가진 행이 있는데,

oldval newval

다음과 같은 명령을 실행하여

subvals.ksh decodefile chgfile

chgfile 에 나타나는 oldval 을 newval 로 교체한다.
이 쉘 스크립트는 standard output으로 기록하는데, 출력 결과는 redirect될 수 있다. 이렇게 redirect된 파일은 dbaccess의 입력 파일로 실행될 수 있다.

6.2 유틸리티(Utilities)

질의의 성능 향상을 위하여 EXPLAIN 유틸리티를 통해 SQL문의 어떻게 데이터베이스에 접근하는지 그 경로를 알 수 있다. 이 유틸리티는 SET EXPLAIN on 문장으로 시작하여 SET EXPLAIN OFF문장으로 종료하고 실행결과는 SQEXPLAIN.OUT파일에 저장된다.
전체 시스템 성능은 onSTAT 유틸리티를 이용하여 모니터링 할 수 있다.

6.3 시스템 카타로그 (System Catalog)

인포믹스시스템 카타로그 테이블내의 모든 오브젝트는 소문자로 저장되고 소유자는 'informix' 이다. Systables 안에서 모든 테이블은 시스템에 의해 tabid가 부여 되고 이것은 다른 시스템 카타로그 테이블과 primary / foreign key로 사용된다.

APPENDIX A. Planning Guide

아래 체크리스트는 오라클 특성을 인포믹스로 얼마나 변환해야 할지 결정하기 위해 유용하게 사용 될 수 있다. 각 항목의 난이도 및 변환에 필요한 노력이 얼마나 필요한지는 1 에서 5단계로 표시된다.




APPENDIX B. Syntax

APPENDIX C. Database Concept

APPENDIX D. ANSI Reserved Words

APPENDIX E. Informix Logic

E.1 CONCAT

CREATE PROCEDURE concat (str1 VARCHAR(255), str2 VARCHAR(255)) 
	RETURNING VARCHAR(255);
	return str1 || str2;
END PROCEDURE;

E.2 INSTR

E.3 LTRIM

CREATE PROCEDURE ltrim (str VARCHAR(255), mask CHAR(1) DEFAULT ' ') 
RETURNING VARCHAR(255);
  	IF str IS NULL THEN
    		RETURN NULL;
  	ELSE
    		RETURN TRIM(LEADING mask from str);
  	END IF;
END PROCEDURE;

E.4 RTRIM

CREATE PROCEDURE rtrim (str VARCHAR(255), mask CHAR(1) DEFAULT ' ') 
RETURNING VARCHAR(255);
  	IF str IS NULL THEN
   		RETURN NULL;
  	ELSE
    		RETURN TRIM(TRAILING mask from str);
  	END IF;
END PROCEDURE;

E.5 TO_CHAR (For Non-Date/Datetime

CREATE PROCEDURE TO_CHAR(i INT)
RETURNING VARCHAR(12);
	RETURN I;
END PROCEDURE;

E.6 YYYYMMDD

CREATE PROCEDURE yyyymmdd (str VARCHAR(10)) RETURNING varchar(8);
  	DEFINE retstr VARCHAR(8);
  	IF str IS NULL THEN
    		RETURN NULL;
  	ELSE
    		LET retstr = str[7,10] || str[1,2] || str[4,5];
    		RETURN retstr;
  	END IF;
END PROCEDURE;

제공 : DB포탈사이트 DBguide.net

728x90

'Informix > informix reference' 카테고리의 다른 글

informix version 확인  (0) 2010.06.01
ONBAR  (0) 2010.05.26
테이블을 특정 시점으로 복구하는 기능  (0) 2010.05.24
[TIP] embedding SQL in UNIX Script  (0) 2009.12.29
DB size  (0) 2009.12.28
728x90

우선 게시판 성격에 맞지 않는 글을 올려서 죄송합니다. devel이나 튜토리얼쪽에는 쓰기권한이 없어서 정보를 공유하고자 여기에 올립니다.


DB내의 쿼리를 쓰면서 Shell 에서도 유용하게 쓸 수 있는 Script 작성 방법을 알려드리고자 합니다. 다 아시다시피 Scipt는 컴파일 할 필요도 없고 어떤 시스템에서도 구동할 수 있다는 장점이 있어서 많은 시스템 관리자들이 유용하게 사용들을 하고 있죠. 이런 Script 내에서 SQL문을 삽입하여 사용을 할 수 있는 방법이 있습니다.


다음의 4가지 예제를 통하여 확인해보시고 각자에 맞게 확장된 script를 만들어서 유용하게 사용하시기 바랍니다.

아래의 예제는 informix의 가장 기본적인 sample인 stores_demo를 이용해서 만들어졌습니다.


1. 직접입력(Redirecting input)


#!/bin/sh

dbaccess <<SQLSTMT

    database stores_demo;

    select customer_num, fname, lname, company from customer;

SQLSTMT


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

sql문을 실행함으로 결과값을 얻을 수 있는 간단한 shell 입니다. 여기서 보이고 있는 SQLSTNT는 단순한 입력 한자리 단어로 마음에 드는 것으로 바꾸어 사용해도 잘 실행이 됩니다. 주의할 점은 sql문 시작시와 끝날때 꼭 같이 넣어주어야 한다는 것입니다.



2. 직접출력(redirecting output)


#!/bin/sh


dbaccess 2>error.log <<SQLSTMT

    database stores_demo;

    select customer_num, fname, lname, company from customer;

SQLSTMT

} | more


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

error.log 라는 필드를 넣음으로 shell 실행 시 발생되는 messages를 저장할 수 도 있고 { } 를 사용한 이후 pipe를 이용하여 more 같은 unix의 다른 프로그램 사용도 가능합니다.



3. Shell변수이용(Using Shell Variable)


#!/bin/sh

echo "Enter company name (use * for wildcard matches) to find"

echo "Company : \c"

read comp

dbaccess 2>error.log <<SQLSTMT

    database stores_demo;

    select customer_num, fname, lname, company from customer

    where company matches "$comp";

SQLSTMT


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

Shell의 변수들을 이용하여 값을 얻어낼 수 도 있습니다. shell 상에서 comp에 값을 입력해주면 where 구문에서 변수값으로 받아 찾아낸 값을 출력해주는 방식입니다. 이런 정도만 사용하는 곳이라면 복잡하게 프로그램 짜거나 일일히 db에 접속하지 않고 단순히 shell만 돌려도 되겠죠?



4. Unix 프로그램에 Shell을 이용해 얻어낸 Data 사용(Getting Data into Shell Variables)


#!/bin/sh 

today=`date +%m/%d/%y` # get today's date 


dbaccess 2>error.log <<SQLSTMT 

    database stores_demo; 

    output to pipe "pr -t" without headings 

    select customer_num, fname,lname,company from customer; 

SQLSTMT 

} | while read line # pipe the output to while read 

do 

if [ "$line" ] # check if line is not NULL 

then 

    # First parse the line into words/variables using set 

    set $line # assign the line to positional variables 

    name="$2 $3" # get the second and third variable for name 

    # company name may include spaces, $4 is only the first word 

    # so we discard the first 3 positions and assign the 

    # rest of the line to the comp variable 

    shift 3 # discard the first three variables 

    comp="$*" # let all remaining variables = the company 

    ## Start of simple form letter` 

    echo "Date: $today" 

    echo "To: $name" 

    echo " $comp" 

    echo "Thank you for your business" 

    echo " "

fi 

done 

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

output이라는 sql내의 명령문을 이용해서 unix의 다른 프로그램으로도 연결할 수 있습니다. 이 예제는 메일머지에 사용된 예제입니다. 다음은 결과입니다.


.............

Date : 03/07/08

To : Chris Putnum

Putnum's Putters

Thank you for your business

Date : 03/07/08

To : James Henry

Total Fitness Sports

Thank you for your business

................



머.. 이 간단한 예제를 더욱 발전시켜서 여러분들의 환경에 잘 써보시기 바랍니다. 아참, 이것은 제가 만든것이 아니고 IIUG의 memeber중의 한명이 Lester Knutsen이 만든것입니다. 다음은 원문입니다.


Simple shell scripts play a role in small programs and very complex applications.

One of the advantages of Unix and Linux is the ability to use scripts for developing systems and programs. I’ll introduce you to using shell scripts with embedded SQL to access your database. Shell scripts are easy to write, they don’t need to be compiled, and are great for small batch programs.

Shell scripts do have their limits. They don’t provide a nice GUI interface and, because they aren’t compiled, everyone gets to see the source code. These limitations, though, are minor trade-offs.

In these examples, I use an Informix database and the Informix SQL command interpreter dbaccess. However, the examples will also work with Informix isql — and should work with any database that lets you redirect standard input and output. The basic items I’ll explore are: redirecting input and output, passing shell variables to SQL, and setting shell variables with the results of SQL commands.

Redirecting Input

One way to include SQL commands in a shell script is to redirect standard input to dbaccess from within the shell script. The example shell script in Listing 1 takes an SQL statement and redirects the SQL so that it is executed by dbaccess.

When dbaccess starts, it expects a database name and SQL script name as its arguments; if they’re not available, dbaccess will display menus and prompt you for them. The two dashes (- -) indicate to dbaccess that the database and commands will come from standard input. The << indicates to the shell that standard input is redirected and that everything between the two occurrences of SQLSTMT is to be passed to dbaccess as standard input. This is called a “here document” in Unix shell scripts.

The program dbaccess treats these lines as if you had typed them in from the keyboard. This is like typing dbaccess - - < filename, where filename is a file with the SQL commands. You don’t have to use SQLSTMT, but you do need two identical words to mark the beginning and end of input redirection. Running this script will start dbaccess and process SQL commands. The first command will open the stores_demo database and the next command will display the name and company of all the customers. You can use any valid SQL command that dbaccess will execute.

Redirecting Output

If you have a large customer table, the output will scroll off the screen. Like most Unix programs, Informix dbaccess will send output to two standard devices that are normally defined as your terminal window. Data goes to standard output, and processing messages go to standard error. In Listing 1, the names and companies are sent to standard output and the two messages (Database selected and 99 row(s) retrieved) are sent to standard error. These can be redirected to a file by changing line 2 in Listing 1 to:

dbaccess - - >cust.rpt 2>error.log <<SQLSTMT

The first > sends standard out (data) to a file cust.rpt and the 2> sends standard error (messages) to an error.log.

What’s more useful is to send data to a paging program (such as more) and messages to a log file (see Listing 2).

Notice that I’ve removed the first > and added a pair of { }. The pair of { } instruct the shell to execute the enclosed statements as a group. This instruction is useful to pipe the output to another program, such as more.

Using Shell Variables

You can use shell variables and prompts with SQL. The example in Listing 3 prompts for a company name and passes the variable to SQL for use in the SELECT statement. Entering an A* at the prompt would select all companies whose names begin with the letter A.

Getting Data Into Shell Variables

The results of an SQL command can be inserted into shell variables. The following is a simple example of a mail-merge program, selecting names and companies from a database, setting shell variables, and merging that data with some text. There are better ways to do this with the programming tools that come with a database, but this example illustrates the power of embedding SQL in shell scripts (see Listing 4).

In this example, the output is sent to a WHILE loop. The WHILE loop reads each line of output until it’s done. Each line is broken apart into words by the set command. The first word is assigned $1, the second $2, and so on. name=”$2 $3” gets the name of the person. The company name is more difficult because it may contain spaces. The name “Big Company” would be broken into to two variables. The command shift 3discards the first three variables, and what was $4 becomes $1. All remaining variables are assigned to the company name with comp=$*.

Mastering Complexity

I’ve just scratched the surface of what you can do with embedded SQL in shell scripts. Many complex applications, such as billing and scheduling systems, are built using SQL in shell scripts. Now you have the tools to put this technique to use.


Lester Knutsen is president of Advanced DataTools Corp., an IBM Informix consulting and training partner specializing in data warehouse development, database design, performance tuning, and Informix training and support. He is president of the Washington D.C. Area Informix User Group, a founding member of the International Informix Users Group, and an IBM gold consultant.


LISTING 1. A shell script for redirecting SQL to dbaccess. 


#!/bin/sh

dbaccess <<SQLSTMT

    database stores_demo;

    select customer_num, fname, lname, company from customer;

SQLSTMT

 


LISTING 2. A shell script to send data to a paging program and messages to a log file. 


#!/bin/sh


dbaccess 2>error.log <<SQLSTMT

    database stores_demo;

    select customer_num, fname, lname, company from customer;

SQLSTMT

} | more

 


LISTING 3. Using a shell variable with SQL. 


#!/bin/sh

echo "Enter company name (use * for wildcard matches) to find"

echo "Company : \c"

read comp

dbaccess 2>error.log <<SQLSTMT

    database stores_demo;

    select customer_num, fname, lname, company from customer

    where company matches "$comp";

SQLSTMT

 


LISTING 4. Setting shell variables and merging data with text. 


#!/bin/sh 

today=`date +%m/%d/%y` # get today's date 


dbaccess 2>error.log <<SQLSTMT 

    database stores_demo; 

    output to pipe "pr t" without headings 

    select customer_num, fname,lname,company from customer; 

SQLSTMT 

} | while read line # pipe the output to while read 

do 

if [ "$line" ] # check if line is not NULL 

then 

    # First parse the line into words/variables using set 

    set $line # assign the line to positional variables 

    name="$2 $3" # get the second and third variable for name 

    # company name may include spaces, $4 is only the first word 

    # so we discard the first 3 positions and assign the 

    # rest of the line to the comp variable 

    shift 3 # discard the first three variables 

    comp="$*" # let all remaining variables = the company 

    ## Start of simple form letter` 

    echo "Date: $today" 

    echo "To: $name" 

    echo " $comp" 

    echo "Thank you for your business" 

fi 

done 

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

EXAMPLE OUTPUT: 

Date: 11/15/93 

To: Frank Lessor 

Phoenix University 

Thank you for your business

728x90

'Informix > informix reference' 카테고리의 다른 글

informix version 확인  (0) 2010.06.01
ONBAR  (0) 2010.05.26
테이블을 특정 시점으로 복구하는 기능  (0) 2010.05.24
Porting from Oracle to Informix  (0) 2009.12.29
DB size  (0) 2009.12.28
728x90

안녕하세요. 정상규입니다.

 

database size를 출력하는 스크립트입니다.

(사용법 : sh dbsize.sh DBNAME)

 

그리고 IDS instance의 개별 database size를 출력하는 쿼리를 첨부하였으니 확인해보시길 바랍니다.

(dbsize.txt)

 

 

참조사이트)

http://www.informix.kr/xe/1177

http://database.sarang.net/?inc=read&aid=2500&criteria=informix&subcrit=qna&id=&limit=20&keyword=&page=4

728x90

'Informix > informix reference' 카테고리의 다른 글

informix version 확인  (0) 2010.06.01
ONBAR  (0) 2010.05.26
테이블을 특정 시점으로 복구하는 기능  (0) 2010.05.24
Porting from Oracle to Informix  (0) 2009.12.29
[TIP] embedding SQL in UNIX Script  (0) 2009.12.29
728x90
$onstat - 
IBM Informix Dynamic Server Version 9.40.UC4     -- on-Line -- Up 7 days 16:45:20 -- 2812948 Kbytes

온라인 상태를 확인한다. 그런데 스크립트 실행시 쿼리 응답이 없을 경우
운영체제 계정의 패스워드를 확인해 볼 필요가 있다.
패스워드에 expiration이 정해져 있는지 확인하고 재설정하면 문제가 해결된다.
728x90

+ Recent posts