34.2. 데이터베이스 윈 토토 관리#

이 섹션은 데이터베이스 윈 토토을 열고 닫고 전환하는 방법에 대해 설명합니다.

34.2.1. 데이터베이스 서버에 윈 토토#

하나는 다음 문을 사용하여 데이터베이스에 윈 토토합니다.

Exec SQL Connect대상[asConnection-name] [사용자사용자 이름];

the대상다음 방법으로 지정할 수 있습니다.

  • dbname[@hostname] [:포트]
  • tcp : postgresql : //hostname[:포트] [/dbname] [?옵션]
  • unix : postgresql : // localhost [:포트] [/dbname] [?옵션]
  • 위의 양식 중 하나를 포함하는 SQL 문자열 리터럴
  • 위 형식 중 하나를 포함하는 문자 변수에 대한 참조 (예제 참조)
  • 기본값

윈 토토 대상기본값기본 사용자 이름에서 기본 데이터베이스에 대한 윈 토토을 시작합니다. 이 경우 별도의 사용자 이름 또는 윈 토토 이름을 지정할 수 없습니다.

윈 토토 대상을 직접 지정하면 (즉, 문자열 문자 또는 가변 참조가 아닌) 대상의 구성 요소는 일반 SQL 구문 분석을 통해 전달됩니다. 이것은 예를 들어를 의미합니다.hostname도트로 분리 된 하나 이상의 SQL 식별자처럼 보이고,이 식별자는 두 번 인용되지 않는 한 케이스 배치됩니다. 모든 값옵션SQL 식별자, 정수 또는 가변 참조 여야합니다. 물론 두 번 인용하여 거의 모든 것을 SQL 식별자에 넣을 수 있습니다. 실제로, 윈 토토 대상을 직접 작성하는 것보다 (단일 크기) 문자열 리터럴 또는 가변 참조를 사용하는 것은 오류가 적을 수 있습니다..

사용자 이름을 지정하는 방법에는 여러 가지가 있습니다.

  • 사용자 이름
  • 사용자 이름/비밀번호
  • 사용자 이름식별비밀번호
  • 사용자 이름사용비밀번호

위와 같이 매개 변수사용자 이름and비밀번호SQL 식별자, SQL 문자열 리터럴 또는 문자 변수에 대한 참조가 될 수 있습니다.

윈 토토 대상에 포함 된 경우옵션키워드=value사양은 Ampersands (에 의해 구분됩니다.&). 허용 된 키워드는에 의해 인식 된 것과 동일합니다.libpq(참조섹션 32.1.2). 공백은 어떤 전에도 무시됩니다키워드또는value, 내부 또는 그 이후는 아니지만. 쓸 방법이 없음&a 내value.

소켓 윈 토토을 지정할 때 (unix :prefix), 호스트 이름은 정확히LocalHost. 비 디폴트 소켓 디렉토리를 선택하려면 디렉토리의 PathName을 A의 값으로 작성하십시오.host옵션옵션대상의 일부.

theConnection-name한 프로그램에서 여러 윈 토토을 처리하는 데 사용됩니다. 프로그램이 하나의 윈 토토 만 사용하는 경우 생략 할 수 있습니다. 가장 최근에 열린 윈 토토은 현재 윈 토토이되며 SQL 문을 실행할 때 기본적으로 사용됩니다 (이 장의 뒷부어 참조).

다음은의 몇 가지 예입니다.Connect진술 :

exec sql mydb@sql.mydomain.com에 윈 토토;

exec sql tcp에 윈 토토 : postgresql : //sql.mydomain.com/mydb myconnection user john;

Exec SQL 시작 선언 섹션;
const char *target = "mydb@sql.mydomain.com";
const char *user = "John";
const char *passwd = "비밀";
Exec SQL END DELLARE SECTION;
 ...
Exec SQL Connect : 대상 사용자 : 사용자 사용 : Passwd;
/* 또는 EXEC SQL Connect : 대상 사용자 : user/: passwd; */

마지막 예제는 위에 언급 된 기능을 문자 변수 참조로 사용합니다. 콜론으로 접두사 할 때 C 변수가 SQL 문에서 C 변수를 어떻게 사용할 수 있는지 나중에 볼 수 있습니다.

윈 토토 대상의 형식이 SQL 표준에 지정되지 않은 것이 좋습니다. 따라서 휴대용 애플리케이션을 개발하려면 위의 마지막 예제를 기반으로 무언가를 사용하여 윈 토토 대상 문자열을 캡슐화하여 어딘가에 있습니다.

신뢰할 수없는 사용자가 채택되지 않은 데이터베이스에 액세스 할 수있는 경우보안 스키마 사용 패턴, 공개적으로 쓰레기 스키마를 제거하여 각 세션을 시작하십시오search_path. 예를 들어 add옵션 = -c search_path =to옵션또는 문제exec SQL 선택 PG_CATALOG.SET_CONFIG ( 'Search_Path', '', False);윈 토토 후. 이 고려 사항은 ECPG에만 국한되지 않습니다. 임의의 SQL 명령을 실행하기 위해 모든 인터페이스에 적용됩니다.

34.2.2. 윈 토토 선택#

임베디드 SQL 프로그램의 SQL 문은 기본적으로 현재 윈 토토에 대해 실행됩니다. 응용 프로그램이 여러 윈 토토을 관리 해야하는 경우이를 처리하는 세 가지 방법이 있습니다.

첫 번째 옵션은 각 SQL 문에 대한 윈 토토을 명시 적으로 선택하는 것입니다.

exec sql atConnection-name선택 ...;

이 옵션은 응용 프로그램이 혼합 순서로 여러 윈 토토을 사용해야하는 경우 특히 적합합니다.

응용 프로그램에서 여러 실행 스레드를 사용하는 경우 동시에 윈 토토을 공유 할 수 없습니다. 윈 토토에 대한 액세스 (Mutxes 사용)에 대한 액세스를 명시 적으로 제어하거나 각 스레드에 대한 윈 토토을 사용해야합니다.

두 번째 옵션은 현재 윈 토토을 전환하기 위해 문을 실행하는 것입니다. 그 진술은 :

Exec SQL Set ConnectionConnection-name;

이 옵션은 동일한 윈 토토에서 많은 진술을 실행 해야하는 경우 특히 편리합니다.

여러 데이터베이스 윈 토토을 관리하는 예제 프로그램이 있습니다 :

#include <stdio.h

Exec SQL 시작 선언 섹션;
    char dbname [1024];
Exec SQL END DELLARE SECTION;

int
기본()

    EXEC SQL TestDB1에 CON1 사용자 테스트를 사용합니다.
    Exec SQL 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec SQL 커밋;
    EXEC SQL TestDB2에 CON2 사용자 테스트를 윈 토토하고;
    Exec SQL 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec SQL 커밋;
    Exec SQL TestDB3에 CON3 사용자 테스트를 윈 토토하고;
    Exec SQL 선택 PG_CATALOG.SET_CONFIG ( 'search_Path', '', False); Exec SQL 커밋;

    /*이 쿼리는 마지막으로 열린 데이터베이스 "TestDB3"에서 실행됩니다. */
    exec SQL select current_database ()에 : dbname;
    printf ( "current =%s (testdb3이어야 함) \ n", dbname);

    / * "at"사용 "testdb2"에서 쿼리를 실행합니다. */
    con2에서 exec sql current_database ()를 선택하십시오 : dbname;
    printf ( "current =%s (testdb2이어야 함) \ n", dbname);

    /* 현재 윈 토토을 "TestDB1"으로 전환합니다. */
    EXEC SQL SET 윈 토토 CON1;

    exec SQL select current_database ()에 : dbname;
    printf ( "current =%s (testdb1이어야 함) \ n", dbname);

    Exec SQL 모든 분리;
    반환 0;

이 예제는이 출력을 생성합니다 :

current = testdb3 (testdb3이어야합니다)
current = testdb2 (testdb2이어야 함)
current = testdb1 (testdb1이어야 함)

세 번째 옵션은 윈 토토에 윈 토토된 SQL 식별자를 선언하는 것입니다.

exec sql atConnection-name선언Statement-Name진술;
Exec SQL 준비Statement-Name출발 :Dyn-String;

SQL 식별자를 윈 토토에 윈 토토하면 AT 절없이 동적 SQL을 실행합니다. 이 옵션은 사전 처리기 지시문처럼 작동하므로 링크는 파일에서만 활성화됩니다.

다음은이 옵션을 사용하는 예제 프로그램입니다.

#include <stdio.h

Exec SQL 시작 선언 섹션;
char dbname [128];
char *dyn_sql = "select current_database ()";
Exec SQL END DELLARE SECTION;

int main () 
  exec SQL은 con1로 postgres에 윈 토토하고;
  exec sql testdb에 con2로 윈 토토;
  CON1에서 SQL EXEC STMT 문을 선언합니다.
  Exec SQL STMT 준비 : Dyn_SQL;
  exec SQL STMT를 실행합니다 : dbname;
  printf ( "%s \ n", dbname);

  Exec SQL 모든 분리;
  반환 0;

이 예제는 기본 윈 토토이 testdb : 이더라도이 출력을 생성합니다.

Postgres

34.2.3. 윈 토토 닫기#

윈 토토을 닫으려면 다음 진술을 사용하십시오.

Exec SQL 분리 [Connection];

the윈 토토다음 방법으로 지정할 수 있습니다.

  • Connection-name
  • 현재
  • all

윈 토토 이름이 지정되지 않으면 현재 윈 토토이 닫힙니다.

응용 프로그램이 항상 열린 윈 토토과 명시 적으로 분리하는 것이 좋습니다.

정정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면