다음 명령을 사용하여 데이터베이스에 액세스할 수 있습니다 PL/Tcl 함수 본문에서:
spi_exec ?-개수n? ?-배열이름? 명령 ?루프-본문?문자열로 제공된 SQL 명령을 실행합니다. 오류
이 명령으로 인해 오류가 발생합니다. 그렇지 않으면,
반환 값spi_exec이다
처리된 행 수(선택, 삽입, 업데이트,
또는 삭제됨) 명령에 의해, 또는 명령이 다음과 같은 경우 0입니다.
유틸리티 진술. 또한 명령이 다음과 같은 경우선택문, 값
선택한 열은 다음과 같이 Tcl 변수에 배치됩니다.
아래에 설명되어 있습니다.
선택사항-개수가치가 말해주는 것spi_exec최대 수
명령에서 처리할 행 수입니다. 이것의 효과는
쿼리를 커서로 설정한 다음
말하는 중가져오기n.
명령이 다음과 같은 경우선택문, 결과 열의 값은 열 이름을 따서 명명된 Tcl 변수. 만약-배열옵션이 주어지면 열 값 대신 명명된 연관 배열에 저장됩니다. 배열 인덱스로 사용되는 열 이름입니다.
명령이 다음과 같은 경우선택진술 및 아니오루프-본문스크립트가 제공되면 결과의 첫 번째 행만 표시됩니다.
Tcl 변수에 저장됩니다. 나머지 행(있는 경우)은 다음과 같습니다.
무시되었습니다. 쿼리가 행을 반환하지 않으면 저장이 발생하지 않습니다.
(이런 경우는 결과를 확인하면 알 수 있습니다.spi_exec.) 예를 들어,
spi_exec "SELECT count(*) AS cnt FROM pg_proc"
토토 사이트 변수를 설정합니다$cnt행의 수에pg_proc시스템 카탈로그.
선택사항인 경우루프-본문인수가 주어졌습니다. 각 행에 대해 한 번 실행되는 토토 사이트 스크립트 조각 쿼리 결과. (루프-본문주어진 경우 무시됩니다. 명령은 a가 아닙니다.선택.) 현재 행의 열 값은 Tcl에 저장됩니다. 각 반복 전의 변수. 예를 들어,
spi_exec -array C "SELECT * FROM pg_class"
elog DEBUG "테이블 $C(relname) 있음"
다음의 모든 행에 대한 로그 메시지를 인쇄합니다.pg_class. 이 기능은 다음과 유사하게 작동합니다. 다른 Tcl 루핑 구성; 특히계속그리고휴식루프 본문 내에서 일반적인 방식으로 작업합니다.
쿼리 결과의 열이 null인 경우 대상은 변수는 다음과 같습니다"설정 해제"설정되지 않고.
spi_prepare 질의 유형 목록나중 실행을 위해 쿼리 계획을 준비하고 저장합니다. 는 저장된 계획은 현재의 수명 동안 유지됩니다 세션.
쿼리는 매개변수, 즉 자리 표시자를 사용할 수 있습니다. 계획이 실제로 실행될 때마다 제공되는 값 실행. 쿼리 문자열에서 매개변수를 다음으로 참조합니다. 기호$1 ... $n. 만약 쿼리는 매개변수를 사용하며 매개변수 유형의 이름은 Tcl 목록으로 제공되어야 합니다. (빈 목록 작성유형 목록매개변수가 없는 경우 사용됩니다.) 현재 매개변수 유형은 다음과 같아야 합니다. 시스템에 표시된 내부 유형 이름으로 식별됩니다. 테이블pg_type; 예를 들어int4아님정수.
다음의 반환 값spi_prepare다음에 사용할 쿼리 ID입니다.
후속 호출spi_execp. 참조spi_execp예를 들어.
spi_execp ?-개수n? ?-배열이름? ?-null문자열? 쿼리ID ?값 목록?
?루프-본문?이전에 준비된 쿼리를 실행합니다.spi_prepare. 쿼리ID다음에서 반환한 ID입니다.spi_prepare. 쿼리의 경우
참조 매개변수, a값 목록반드시 제공되어야 합니다. 이것은
매개변수에 대한 실제 값의 Tcl 목록입니다. 목록
매개변수 유형 목록과 길이가 같아야 합니다.
이전에 다음에게 주어졌습니다.spi_prepare. 생략값 목록쿼리가 없는 경우
매개변수.
다음에 대한 선택적 값-null공백의 문자열이며'n'문자가 말하는spi_execp매개변수 중 null 값인 것은 무엇입니까? 주어진다면 반드시
길이가 와 정확히 같습니다.값 목록. 주어지지 않으면 모두
매개변수 값이 null이 아닙니다.
쿼리 및 해당 매개변수를 사용하는 방식은 제외
지정되었습니다.spi_execp다음과 같이 작동합니다spi_exec.-개수, -배열및루프-본문옵션은 동일하며
결과 값도 마찬가지입니다.
다음은 준비된 PL/Tcl 함수의 예입니다. 계획:
CREATE FUNCTION t1_count(정수, 정수) 정수 AS '를 반환합니다.
if ![ 정보가 존재하는 경우 GD(plan) ]
# 첫 번째 호출에서 저장된 계획을 준비합니다.
GD 설정(계획) [ spi_prepare \\
"SELECT count(*) AS cnt FROM t1 WHERE num = \\$1 AND num <= \\$2" \\
[ 목록 int4 int4 ] ]
spi_execp -count 1 $GD(계획) [ 목록 $1 $2 ]
$cnt 반환
' 언어 pltcl;
Tcl이 봐야 하는 각 백슬래시는 다음과 같아야 합니다.
함수를 입력하면 기본 파서가 두 배로 늘어납니다.
백슬래시도 처리합니다.만들기
기능. 쿼리 문자열 내에 백슬래시가 필요합니다.
에게 주어졌다spi_prepare에
다음을 확인하세요.$n마커가 통과됩니다
에spi_prepare있는 그대로, 그렇지 않음
토토 사이트 변수 대체으로 대체되었습니다.
spi_lastoid마지막으로 삽입된 행의 OID를 반환합니다.spi_exec또는spi_execp, 명령이
단일 행삽입. (그렇지 않다면 당신은
0을 얻습니다.)
인용문 문자열작은따옴표와 백슬래시가 모두 중복됩니다.
주어진 문자열의 문자. 안전하게 사용할 수 있습니다.
SQL 명령에 삽입될 인용 문자열
에게 주어졌다spi_exec또는spi_prepare. 예를 들어,
다음과 같은 SQL 명령 문자열을 생각해 보세요.
"'$val' AS ret 선택"
여기서 토토 사이트 변수발실제로는 다음을 포함함그렇지 않습니다. 이 최종 명령 문자열이 생성됩니다.
SELECT '다시 하지 않음'
이 과정에서 구문 분석 오류가 발생합니다.spi_exec또는spi_prepare. 제출된 명령은 다음과 같습니다.
포함
재개로 '하지 않음' 선택
다음을 사용하여 PL/Tcl로 형성될 수 있습니다.
"SELECT '[ quote $val ]' AS ret"
한 가지 장점spi_execp이렇게 매개변수 값을 인용할 필요가 없다는 점입니다.
매개변수는 SQL의 일부로 구문 분석되지 않으므로
명령 문자열.
elog 레벨 msg로그 또는 오류 메시지를 내보냅니다. 가능한 수준은 다음과 같습니다.디버그, 로그, 정보, 공지, 경고, 오류및치명적. 대부분은 단순히 주어진 것을 방출합니다. 메시지는 다음과 같습니다.elogC 기능.오류오류 발생 조건: 함수의 추가 실행이 중단됩니다. 현재 거래가 중단되었습니다.치명적트랜잭션을 중단하고 현재 세션을 종료합니다. (아마 좋은 일은 없을 거야. PL/Tcl 함수에서 이 오류 수준을 사용하는 이유는 무엇입니까? 이는 완전성을 위해 제공됩니다.)