728x90

오라클 호환모드가 설정되어 있는 데이터베이스에서 트리거 생성시 오류가 발생하는 케이스에 대해 소개합니다.

DB2 인스턴스 계정에서 db2set 명령으로 오라클 호환모드 설정내역을 확인합니다.


$ db2set -all

[i] DB2_COMPATIBILITY_VECTOR=ORA

[i] DB2_SKIPINSERTED=on

[i] DB2_OPTPROFILE=yes

[i] DB2_EVALUNCOMMITTED=yes

[i] DB2_SKIPDELETED=on

[i] DB2DBDFT=hansdb

[i] DB2COMM=TCPIP

[i] DB2AUTOSTART=NO



$ db2 "create table test (aa int, id char(20))"
DB20000I  The SQL command completed successfully.
$ db2 "create table test_his (aa int, id char(20))"
DB20000I  The SQL command completed successfully.

아래는 트리거 내용입니다.

$ cat create_trigger.sql
   CREATE OR REPLACE TRIGGER TRI1 NO CASCADE AFTER INSERT on TEST
      REFERENCING NEW AS N
      FOR EACH ROW
      BEGIN
             INSERT INTO TEST_HIS (aa,id) VALUES (N.aa, N.id);
      END
!

트리거를 생성하려고 하면 아래와 같이 SQL0206N 오류가 발생합니다.

$ db2 -td! -f create_trigger.sql
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0206N  "N.AA" is not valid in the context where it is used.  LINE NUMBER=5.
SQLSTATE=42703

오류 원인은 오라클 호환모드로 인한 것으로, 오라클 호환모드에서 위와 같이 TRIGGER 생성 구문을 사용하면 우선적으로 오라클 스타일로 해석되는 것 같습니다.
따라서 DB2 스타일로 인식되도록 FOR EACH ROW를 FOR EACH ROW MODE DB2SQL 로 바꿔줍니다.

CREATE TRIGGER TRI1 AFTER INSERT on TEST
      REFERENCING NEW AS N
      FOR EACH ROW MODE DB2SQL
      BEGIN
             INSERT INTO TEST_HIS VALUES (N.aa, N.id);--
      END
!


http://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000931.html


728x90
728x90

4KB가 넘는 이미지 데이터가 hex string으로 존재하고 이를 이미지 형태로 ORACLE 테이블에 입력하는 예제입니다.

먼저 아래와 같은 함수를 만듭니다. 함수는 stack overflow의 글에서 참조했습니다.

기본적인 기능만 있어 예외처리가 필요할 수 있습니다.


create or replace function hextoblob(data in clob) return blob

is

    v_blob    blob;

    v_start  pls_integer := 1;

    v_buffer pls_integer := 4000;

begin


    dbms_lob.createtemporary(v_blob, true);


    for i in 1..ceil(dbms_lob.getlength(data) / v_buffer)

    loop

        dbms_lob.append(v_blob, hextoraw(DBMS_LOB.SUBSTR(data, v_buffer, v_start)));

        v_start := v_start + v_buffer;

    end loop; 


    return v_blob;

end;


위의 예제는 NULL값 처리는 제외된 내용입니다. 관련 내용은 아래 링크를 참고해주세요.


작업 전에 hex string 데이터를 CLOB 필드에 입력합니다. 

$ sqlplus scott/tiger

 

SQL> create table img (img clob);

 

Table created.

 

$ cat img.ctl     << SQL*Loader control file

 

load data

infile '/work2/INFORMIX/1150FC9W3/HDR_PRI/unload/img.unl'

append

into table img

( IMG CHAR(1000000) )

 

$  sqlldr userid=scott/tiger control='./img.ctl'

 

SQL*Loader: Release 11.2.0.1.0 - Production on Tue Nov 22 10:51:25 2016

 

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

 

Commit point reached - logical record count 1

 

그리고 입력된 hex string 을 4000바이트씩 자른 후, hextoraw 함수로 변환하는 것입니다.

hextoraw 함수는 CHAR, VARCHAR2, NCHAR, NVARCHAR2 타입만 지원하므로 잘라서 처리해야 합니다.

SQL> create table test_lob (img blob);

 

Table created.

 

insert into test_lob select hextoblob(img) from img;

 

1 row created.

 


참조 사이트:

http://stackoverflow.com/questions/8549138/oracle-rawtohex-function-what-happens-if-return-value-exceeds-varchar2-limit

728x90
728x90

인포믹스에서는 listagg나 group_concat 같은 함수가 제공되지 않습니다.

프로시저나 함수같은 프로그램을 사용해야합니다.


아래는 인포믹스 11.5버전에서 실행해본 예제입니다.

AGGREGATE에 대한 자세한 설명은 아래의 페이지를 참고해보세요.


$ dbaccess stores_demo -

> CREATE FUNCTION gc_init...

> CREATE FUNCTION gc_iter...

> CREATE FUNCTION gc_comb...

> CREATE FUNCTION gc_fini...

> CREATE AGGREGATE group_concat...


CREATE FUNCTION gc_init(dummy VARCHAR(255)) RETURNING LVARCHAR;
    RETURN '';
END FUNCTION;
CREATE FUNCTION gc_iter(result LVARCHAR, value VARCHAR(255))
    RETURNING LVARCHAR;
    IF result = '' THEN
        RETURN TRIM(value);
    ELSE
        RETURN result || ',' || TRIM(value);
    END IF;
END FUNCTION;
CREATE FUNCTION gc_comb(partial1 LVARCHAR, partial2 LVARCHAR)
    RETURNING LVARCHAR;
    IF partial1 IS NULL OR partial1 = '' THEN
        RETURN partial2;
    ELIF partial2 IS NULL OR partial2 = '' THEN
        RETURN partial1;
    ELSE
        RETURN partial1 || ',' || partial2;
    END IF;
END FUNCTION;
CREATE FUNCTION gc_fini(final LVARCHAR) RETURNING LVARCHAR;
    RETURN final;
END FUNCTION;
CREATE AGGREGATE group_concat
    WITH (INIT = gc_init, ITER = gc_iter,
          COMBINE = gc_comb, FINAL = gc_fini);

> create table test (name varchar(20),nickname varchar(20));

 
Table created.
 
> insert into test values ('홍길동','구름');
 
1 row(s) inserted.
 
> insert into test values ('심청이','달');
 
1 row(s) inserted.
 
> insert into test values ('변사또','해');
 
1 row(s) inserted.
 
> insert into test values ('홍길동','달');
 
1 row(s) inserted.
 
> insert into test values ('심청이','별');
 
1 row(s) inserted.
 
> insert into test values ('변사또','물');
 
1 row(s) inserted.
 
 
> select name, group_concat(nickname) from test group by name;
 
 
 
name          홍길동
group_concat  구름,달
 
name          변사또
group_concat  해,물
 
name          심청이
group_concat  달,별
 
3 row(s) retrieved.



http://stackoverflow.com/questions/715350/show-a-one-to-many-relationship-as-2-columns-1-unique-row-id-comma-separate

http://www.ibm.com/support/knowledgecenter/en/SSGU8G_11.70.0/com.ibm.sqls.doc/ids_sqs_0358.htm


728x90
728x90

질문

MACH11환경에서, failover시 FAILOVER_CALLBACK 스크립트가 필요한 이유가 무었인가?


원인

때로는, Primary 엔진이 정상인데도 failover가 되는 경우가 있다, 이런경우에, 같은 디스크를 두서버가 access하게되면 문제가 발생한다. 이러한 경우를 막기 위하여 FAILOVER_CALLBACK 스크립트에 필요한 작업을 지정하여 줄수 있다.


응답

MACH11환경, 특히 SDS환경에서, failover되기 전에, Primary서버에서의 oninit process cleaning 또는 disk access에 대한 제한등에 대한 작업을 선행해야 한다.

아래의 작업들은, failover 시점에 꼭 확인해야할 사항이다 :


onconfig의 FAILOVER_CALLBACK 파라미터를 사용하여, failover시 Secondary가 primary또는 standard로 모드로 변경되기 직전 수행되어져야할 스크립트를 지정할수 있다.


일반적으로 이 스크립트는

1. 원래 primary의 모든 oninit 프로세서를 강제로 죽이는 작업

특히, AF 등의 발생으로 oninit process가 완전히 clear되지 않은 경우에 반드시, 관련 프로세스들을 모두 종료시키는 작업.



2. I/O Fencing 기능을 사용하여, 원래의 primary서버에서 더이상 디스크를 share하여 사용하지 못하도록 지정.



ISV 클러스터 관리 소프트웨어로 장애 복구

http://www.ibm.com/support/knowledgecenter/SSGU8G_11.70.0/com.ibm.admin.doc/ids_admin_1168.htm


공유 파일 시스템에 대한 입출력 펜싱 구성

http://www.ibm.com/support/knowledgecenter/SSGU8G_11.70.0/com.ibm.admin.doc/ids_admin_1397.htm



일단 Secondary가 I/O fencing기능을 사용하여, primary/standard로 모드가 변경된 이후에, 원래의 primary를 복구하는 방법은 아래와 같이 진행될수 있다.


1. Primary서버와 관련된 네트워크 문제 해결

2. primary 서버로 로그인후, running중인 oninit 프로세스가 존재하는지 확인후, 존재한다면 강제로 해당 프로세스 종료시킴

3. disk sharing을 enable시킴 - 자세한 사항은 사용하고 있는 disk cluster s/w 기술참고.

4. 엔진을 기동시킴, 이때 secondary로 엔진이 기동됨.


결론적으로, AF 발생으로 primary서버가 on-line 모드가 아니거나, 네트워크 이상으로 primary 서버가 접근이 되지 않는 경우들에 유용하게 사용되어질수 있습니다.


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

728x90
728x90

Question

How do you insert a newline / carriage return into a character field in dbaccess?

Cause

Sometimes there is the need to insert a newline / carriage return character into a character (varchar, lvarchar, etc.) column of a table to reflect a paragraph type format.

Answer

Within dbaccess or the ISQL menu, one could use the following steps to accomplish this:

create table t2 (c1 lvarchar);

insert into t2 values ('test'||chr(10)||chr(13)||'more test');

Selecting the data within dbaccess, one can see that the newline / carriage return is in the table by viewing the output format of the following select statement:

select * from t1;

c1 test
more test


1 row(s) retrieved.


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

728x90
728x90

Question

How do you find outstanding in-place alters in a database

Answer

Download and run the attached script. It will find and display the tables with outstanding in-place alters in the database. Here is the command line syntax:

    inplacealter.ksh -d database_name -t [ALL| table_name ] [-o [ver|sum]]

    -d database      the name of the database (required) 
    -t [ALL|table]   the name of the table (default is all tables) 
    -o ver|sum       print either verbose or summary (default) report


The verbose report is similar to the oncheck -pT output. The summary output prints out whether the table has any outstanding in-place alters. The utility generates two output files: 
  • inplacealter.out -- in-place alter information
  • inplacealter.update -- SQL dummy update statements


The advantages of this script are: 
  • It places no locks on any tables, so it can be run anytime by the DBA
  • It doesn't run the expensive oncheck -pT to gather the statistics, so it is extremely fast even in the busiest of times on the server.
  • It creates a seperate script for the DBA with update statements for the table to remove the outstanding in-place alters. The update statement chooses a non-index column to be updated so that the engine does a sequential scan to select all pages used by the table.
  • It is written is Korn Shell and awk which are widely available on UNIX systems.

Warning: This script is not supported by Informix Technical Support. If it does not work on your system ask your system administrator for help debugging it. It is written in Korn Shell and may not work in other shells. The generated script containing the update statements can be run as-is; however, this script/updates have a direct impact on database logging and performance (time for the update(s) to complete). Serious consideration needs to be given to both these issues if any of tables referenced in the update statetments are logged and/or are very large.



http://www-01.ibm.com/support/docview.wss?rs=0&uid=swg21160923

728x90
728x90

IIUG Insider #190에 실린 기사입니다.

Gary Ben-Israel 씨의 참조 제약조건 정보를 나열하는 쿼리문장이 소개되어 있습니다.

참고하셔서 사용하실 수 있겠네요.


In this section I will write about things that help me in my day to day work.

Most DBAs probably have their own way to perform these tasks which may be different than the way I do them. So, if you find an error or can think of a better way, please let me know. If not feel free to use these tips as is or modify them to fit your needs.

Today's topic is a view my developers use when they want to find which tables are referencing the table they are dealing with. Some SQL editors can display this information but even when they do it is not always intuitive or easy.

In DBACCESS for instance it takes you six steps. At least that's what it takes me. Needless to say my developers are not familiar with DBACCESS and are not logged into an Informix server.

Performing this with a simple select statement can be helpful. We are using the following view:


create view back_ref_view
(referenced_table, referenced_column, referencing_table, referencing_column,
 cascading_delete, constraint_name, back_ref_view_ik) as
SELECT a.tabname
       d.colname,
       g.tabname,
       i.colname,
       CASE
         WHEN e.delrule = "C" THEN
              "Yes"
         ELSE
              "No"
         END cascaing_delete,
       f.constrname,
       f.constrid
FROM  systables a, sysconstraints b, sysindexes c, syscolumns d,
      sysreferences e, sysconstraints f, systables g, sysindexes h,
      syscolumns i
WHERE b.tabid = a.tabid
  AND b.constrtype = "P"
  AND c.idxname = b.idxname
  AND d.tabid = c.tabid
  AND d.colno = c.part1
  AND e.primary = b.constrid
  AND f.constrid = e.constrid
  AND g.tabid = f.tabid
  AND h.idxname = f.idxname
  AND i.tabid = h.tabid
  AND i.colno = h.part1;
grant select on back_ref_view to "public";


Gary Ben-Israel


http://www.iiug.org/Insider/insider_apr16.php#W4M


728x90
728x90

인포믹스 클라이언트 CSDK 3.70.xC3 이전 버전에는 dbaccess 유틸리티가 포함되어 있지 않습니다.

클라이언트에서 dbaccess를 사용하려면 서버의 dbaccess 파일을 복사하여 사용하는 방법이 있습니다.

기본적으로 인포믹스 서버 설치파일의 $INFORMIXDIR/msg, $INFORMIX/gls 하위 디렉토리 및 파일과 $INFORMIXDIR/bin/dbaccess 파일은 필수적으로 필요합니다.

msg의 citoxmsg.pam, cli3xmsg.pam, clixmsg.pam, itoxmsg.pam 파일도 포함하여 복사하시는 것이 좋습니다. 없을 경우 오류가 발생한 적이 있었습니다.


Question

How to use dbaccess in stand-alone CSDK without Server installation

Cause

There is no dbaccess in CSDK before CSDK 3.70 xC3. It is only provided with Server installation before that CSDK version.

Answer

dbaccess can be used in client side without server installation with the following steps.

1. Copy dbaccess from Server side to CSDK installation directory,such as $CSDKDIR/bin

2. Copy all files in '$INFORMIXDIR/msg/en_us/0333' from server side to CSDK corresponding directory,such as '$CSDKDIR/msg/en_us/0333'

Then dbaccess can be used in client side without Server installation.


3.70.xC3 이후 부터는 클라이언트에 dbaccess가 포함되므로 최근 버전을 사용하시는 경우라면 해당사항이 없습니다.


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

http://www-01.ibm.com/support/docview.wss?uid=swg21613481&myns=swgimgmt&mynp=OCSSGU8G&mync=E

728x90
728x90

Question

From time to time, if an Informix Server crashes, the instance may be left in a state where the Server cannot start, and information about the recovery failure is needed. How can the dba collect information when the database has a failure and cannot recover?

Answer

1.Stop any Informix process that are still running. 
2. Load the environment with the parameter: export STOP_RECOVERY=1 (using an appropriate shell command). 
3. Attempt recovery, by starting the oninit process.

  • The online log will show a message, similar to the following:
      11:26:34 oninit hung at STOPPING_POINT 1, pid=19548
4. While the engine remains in this state, proceed with information collection, such as:
    onstat output, shared memory dump, OS commands etc.
5. After the output is collected, shutdown the engine, using 'onclean -ky', and remove the STOP_RECOVERY environment variable.


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

728x90
728x90

Informix Version : Informix 12.10.FC5W1

OS : Windows 2012 R2

 

윈도우 2012에 인포믹스 설치 중 아래와 같은 오류가 발생했습니다. 찾아보니 설치프로그램의 호환성 이슈인 것 같습니다. 설치프로그램의 호환 모드를 Windows 7으로 했을 때 잘 설치되었습니다.

 

The Application has Unexpectedly Quit



Invocation of this Java Application has caused an

Invocation TargetException. This application will not exit (LAX)



ZeroGu6: Windows DLL failed to load
    at ZeroGa4.b(DashoA10*..)
    at ZeroGa4.b(DashoA10*..)
    at com.zerog.ia.installer.LifeCycleManager.b(DashoA10*..)
    at com.zerog.ia.installer.LifeCycleManager.a(DashoA10*..)
    at com.zerog.ia.installer.Main.main(DashoA10*..)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
    at java.lang.reflect.Method.invoke(Method.java:611)
    at com.zerog.lax.LAX.launch(DashoA10*..)
    at com.zerog.lax.LAX.main(DashoA10*..)

 

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

728x90

+ Recent posts