35.2. 데이터베이스 젠 토토 관리

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

35.2.1. 데이터베이스 서버에 젠 토토

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

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

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

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

연결 대상을 문자 그대로 지정하는 경우 (즉, 변수 참조가 아닌) 값을 인용하지 않으면 일반 SQL의 사례 감도 규칙이 적용됩니다. 이 경우 필요에 따라 개별 매개 변수를 개별적으로 이중으로 인용 할 수도 있습니다. 실제로, (단일 크기) 문자열 리터럴 또는 변수 참조를 사용하는 것은 오류가 적을 수 있습니다. 연결 대상기본값기본 사용자 이름에서 기본 데이터베이스에 대한 연결을 시작합니다. 이 경우 별도의 사용자 이름 또는 연결 이름을 지정할 수 없습니다.

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

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

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

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

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

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

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

exec sql mydb@sql.mydomain.com에 연결;

exec sql unix에 연결 : 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 표준에 지정되지 않은 것이 좋습니다. 따라서 휴대용 애플리케이션을 개발하려면 위의 마지막 예제를 기반으로 무언가를 사용하여 연결 대상 문자열을 캡슐화하여 어딘가에 있습니다.

35.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이어야 함)

35.2.3. 젠 토토 닫기

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

Exec SQL 분리 [Connection];

theConnection다음 방법으로 지정할 수 있습니다.

  • Connection-name
  • 현재
  • all

연결 이름이 지정되지 않으면 현재 연결이 닫힙니다.

응용 프로그램이 항상 열린 젠 토토에서 명시 적으로 분리하는 것은 좋은 스타일입니다.

정정 제출

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