| 롤 토토 : 문서 : 9.5 : 롤 토토 | |||
|---|---|---|---|
| Postgre토토 캔 : 문서 : 9.5 : 개념 | 토토 핫 : 문서 : 9.5 : ECPG- C에 포함 된 SQL | 33장.ECPG- 삽입됨SQLC에서 | 다음 |
이 섹션에서는 데이터베이스 토토 핫을 열고 닫고 전환하는 방법을 설명합니다.
다음 명령문을 사용하여 데이터베이스에 토토 핫합니다:
EXEC SQL 토토 핫 대상대상 [AS토토 핫 이름] [사용자사용자 이름];
그대상다음 방법으로 지정할 수 있습니다:
DB이름[@호스트 이름][:포트]
tcp:postgresql://호스트 이름[:포트][/db이름][?옵션]
unix:postgresql://호스트 이름[:포트][/db이름][?옵션]
위 형식 중 하나를 포함하는 SQL 문자열 리터럴
위 형식 중 하나를 포함하는 문자 변수에 대한 참조(예제 참조)
기본값
토토 핫 대상을 문자 그대로 지정하고(즉, 변수 참조를 통하지 않음) 값을 인용하지 않으면 일반 SQL의 대소문자 구분 규칙이 적용됩니다. 이 경우 필요에 따라 개별 매개변수를 별도로 큰따옴표로 묶을 수도 있습니다. 실제로는 (작은따옴표로 묶인) 문자열 리터럴이나 변수 참조를 사용하는 것이 오류 발생 가능성이 적습니다. 토토 핫 대상기본값기본 사용자 이름으로 기본 데이터베이스에 대한 토토 핫을 시작합니다. 이 경우 별도의 사용자 이름이나 토토 핫 이름을 지정할 수 없습니다.
사용자 이름을 지정하는 방법도 다양합니다:
사용자 이름
사용자 이름/비밀번호
사용자 이름식별자:비밀번호
사용자 이름사용 중비밀번호
위와 같이 매개변수사용자 이름그리고비밀번호SQL 식별자, SQL 문자열 리터럴 또는 문자 변수에 대한 참조일 수 있습니다.
토토 핫 대상에 다음이 포함된 경우옵션, 이는 다음으로 구성됩니다.키워드=값앰퍼샌드로 구분된 사양(&). 허용되는 키워드는 다음에서 인식하는 것과 동일합니다.libpq(참조섹션 31.1.2). 공백은 임의 앞에 무시됩니다.키워드또는값, 하지만 1 이내 또는 이후는 아닙니다. 쓸 수 있는 방법이 없다는 점 참고하세요&내부값.
그토토 핫 이름은 하나의 프로그램에서 여러 토토 핫을 처리하는 데 사용됩니다. 프로그램이 하나의 토토 핫만 사용하는 경우 생략할 수 있습니다. 가장 최근에 열린 토토 핫이 현재 토토 핫이 되며, 이는 SQL 문이 실행될 때 기본적으로 사용됩니다(이 장의 뒷부분 참조).
신뢰할 수 없는 사용자가 다음을 채택하지 않은 데이터베이스에 액세스할 수 있는 경우보안 스키마 사용 패턴, 공개적으로 쓰기 가능한 스키마를 제거하여 각 세션을 시작합니다.검색_경로. 예를 들어 다음을 추가하세요.옵션=-c 검색_경로=에옵션또는 문제EXEC SQL SELECT pg_catalog.set_config('search_path', '', false);토토 핫 후. 이 고려 사항은 ECPG에만 국한되지 않습니다. 임의의 SQL 명령을 실행하기 위한 모든 인터페이스에 적용됩니다.
다음은 몇 가지 예입니다토토 핫문장:
EXEC SQL이 mydb@sql.mydomain.com에 토토 핫됩니다. EXEC SQL CONNECT TO unix:postgresql://sql.mydomain.com/mydb AS myconnection USER john; EXEC SQL 시작 선언 섹션; const char *target = "mydb@sql.mydomain.com"; const char *user = "존"; const char *passwd = "비밀"; EXEC SQL END 선언 섹션; ... EXEC SQL 토토 핫 대상 :target USER :user USING :passwd; /* 또는 EXEC SQL CONNECT TO :target USER :user/:passwd; */
마지막 형식은 위에 언급된 변형을 문자 변수 참조로 사용합니다. C 변수에 콜론을 접두어로 붙여 SQL 문에서 C 변수를 사용하는 방법은 이후 섹션에서 살펴보겠습니다.
토토 핫 대상의 형식은 SQL 표준에 지정되어 있지 않습니다. 따라서 이식 가능한 애플리케이션을 개발하려면 위의 마지막 예를 기반으로 한 것을 사용하여 토토 핫 대상 문자열을 어딘가에 캡슐화하는 것이 좋습니다.
Embedded SQL 프로그램의 SQL 문은 기본적으로 현재 토토 핫, 즉 가장 최근에 열린 토토 핫에서 실행됩니다. 애플리케이션이 여러 토토 핫을 관리해야 하는 경우 이를 처리하는 두 가지 방법이 있습니다.
첫 번째 옵션은 각 SQL 문에 대한 토토 핫을 명시적으로 선택하는 것입니다. 예를 들면 다음과 같습니다.
EXEC SQL AT토토 핫 이름선택 ...;
이 옵션은 응용프로그램이 여러 토토 핫을 혼합된 순서로 사용해야 하는 경우 특히 적합합니다.
응용 프로그램이 여러 실행 스레드를 사용하는 경우 동시에 토토 핫을 공유할 수 없습니다. 토토 핫에 대한 액세스를 명시적으로 제어하거나(뮤텍스 사용) 각 스레드에 대한 토토 핫을 사용해야 합니다.
두 번째 옵션은 현재 토토 핫을 전환하는 명령문을 실행하는 것입니다. 그 진술은 다음과 같습니다:
EXEC SQL 세트 토토 핫토토 핫 이름;
이 옵션은 동일한 토토 핫에서 많은 명령문이 실행되는 경우 특히 편리합니다.
다음은 여러 데이터베이스 토토 핫을 관리하는 예제 프로그램입니다:
#include <stdio.h
EXEC SQL 시작 선언 섹션;
char 데이터베이스 이름[1024];
EXEC SQL END 선언 섹션;
정수
메인()
EXEC SQL CONNECT TO testdb1 AS con1 USER testuser;
EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;
EXEC SQL CONNECT TO testdb2 AS con2 USER testuser;
EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;
EXEC SQL CONNECT TO testdb3 AS con3 USER testuser;
EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL 커밋;
/* 이 쿼리는 마지막으로 열린 데이터베이스 "testdb3"에서 실행됩니다. */
EXEC SQL SELECT current_database() INTO :dbname;
printf("현재=%s(testdb3이어야 함)\n", dbname);
/* "testdb2"에서 쿼리를 실행하기 위해 "AT"를 사용함 */
EXEC SQL AT con2 SELECT current_database() INTO :dbname;
printf("현재=%s(testdb2여야 함)\n", dbname);
/* 현재 토토 핫을 "testdb1"로 전환합니다. */
EXEC SQL SET 토토 핫 con1;
EXEC SQL SELECT current_database() INTO :dbname;
printf("현재=%s(testdb1이어야 함)\n", dbname);
EXEC SQL 모두 토토 핫 해제;
0을 반환합니다.
이 예는 다음과 같은 출력을 생성합니다:
current=testdb3 (testdb3이어야 함) current=testdb2(testdb2여야 함) current=testdb1(testdb1이어야 함)
토토 핫을 닫으려면 다음 명령문을 사용하십시오:
EXEC SQL 토토 핫 해제 [토토 핫];
그토토 핫다음 방법으로 지정할 수 있습니다:
토토 핫 이름
기본값
현재
전체
토토 핫 이름이 지정되지 않으면 현재 토토 핫이 닫힙니다.
애플리케이션이 열린 모든 토토 핫에서 항상 명시적으로 토토 핫을 끊는 것이 좋은 스타일입니다.