2009-10-09 5 views
1

C를 통해 Informix에 액세스하는 레거시 응용 프로그램에서 다음 코드 단편을 볼 수 있습니다. 코드의 SQL이 달성하고자하는 것을 누구나 설명 할 수 있습니까? 감사.코드 조각에 대한 설명

EXEC SQL BEGIN DECLARE SECTION; 
int i_tableref; 
EXEC SQL END DECLARE SECTION; 

    /* Some code here */ 

if (!i_sel_ref) 
{ 
    exec sql begin declare section; 
    const char *sql1 = 
     "select refer_num.nextval from table (SET{''})"; 
    exec sql end declare section; 
    exec sql prepare oref_sel_fid from :sql1; 
    if (sqlca.sqlcode != SQL_OK) 
    { 
     /* some code */ 
    } 
    /* More code */ 
} 

답변

1

나는 refer_num이라는 데이터베이스 시퀀스에서 다음 값을 얻고 있다고 생각합니다. 시퀀스는 숫자 고유 식별자 (일부 DBMS의 IDENTITY 열과 비슷한 비트)의 값을 생성하는 방법입니다. 나는 Informix를 모르지만 제 생각에 "테이블 (SET { ''})은 실제로는 액세스 할 필요가없는 select 문을 수행 할 수 있도록 1 행의 의사 테이블을 생성하는 방법입니다 모든 실제 데이터베이스 테이블. 오라클은이 목적을 위해 DUAL라는 특수 테이블을 가지고 있으며, 이는 일반적인 오라클 광경 것 : 인포믹스의 시퀀스 생성기의 다음 값을 얻기위한

select refer_num.nextval from dual; 
+0

에서 your_seq_generator_name.nextval를 선택 IDS의 최근 버전에는 'sysdual'과 같은 이름의 테이블이 있습니다. 나는 데이터베이스를 만들 때'dual'이라는 테이블을 만듭니다. 단일 엘리먼트 테이블의 전형적인 표현은 "SELECT refer_num.nextval FROM systables WHERE tabid = 1' '입니다 (또는 코드가 MODE ANSI 데이터베이스에서도 작동하도록한다면,'SELECT refer_num.nextval FROM"informix ".systables where tabid = 1' '). –

+0

또한 최신 버전의 IDS (실제로 시퀀스가있는 모든 버전의 IDS가 최신 버전 임)에서는 EXECUTE IMMEDIATE를 사용하여 코드 볼륨을 줄일 수 있습니다. –

+0

적어도 개발자 중 한 명이 맞춤 sysdual에 하나 더 많은 가치를 추가하기로 결정한 이후로 (항상 tabid = 1 절을 사용하여) 'table (set {1})'접근법이나 Jonathan이 언급 한 접근법을 선호했습니다 우리가 만든 테이블, 코드 폭탄의 다양한 조각의 결과로 ... – calvinkrishy

-1

:

table(set{1});