2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 토토 핫 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.토토 꽁 머니 : 문서 : 17 : 44.2. 데이터 값버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

42.3. 데이터 값

일반적으로 말하면, PL/Python의 목표는 다음을 제공하는 것입니다."자연스러운"사이 매핑 토토 핫과 Python 세계. 이는 데이터 매핑을 알려줍니다. 아래에 설명된 규칙입니다.

42.3.1. 데이터 유형 매핑

함수 인수는 토토 핫 유형에서 변환됩니다 해당 Python 유형으로:

  • 포스트그레SQL부울다음으로 변환됩니다. 파이썬부울.

  • 포스트그레SQLsmallint그리고int파이썬으로 변환됩니다int. 포스트그레SQL비긴트이다 으로 변환됨Python 2 및 toint파이썬 3에서.

  • 포스트그레SQL진짜, 더블숫자있습니다 Python으로 변환됨플로트. 참고하세요 에 대한숫자이것은 패배합니다 정보를 제공하여 잘못된 결과를 초래할 수 있습니다. 이것은 아마도 향후 릴리스에서 수정될 예정입니다.

  • 토토 핫바이테아다음으로 변환됩니다. 파이썬strPython 2 및 to바이트Python 3에서는. Python 2에서는 문자열은 아무 것도 없이 바이트 시퀀스로 처리되어야 합니다. 문자 인코딩.

  • 토토 핫 문자를 포함한 기타 모든 데이터 유형 문자열 유형은 Python으로 변환됩니다.str. Python 2에서 이 문자열은 토토 핫 서버 인코딩; Python 3에서는 모든 문자열과 같은 유니코드 문자열입니다.

  • 비스칼라 데이터 유형에 대해서는 아래를 참조하십시오.

함수 반환 값은 선언된 값으로 변환됩니다. 토토 핫은 다음과 같은 데이터 유형을 반환합니다.

  • 토토 핫 반환 유형이 다음과 같은 경우부울, 반환 값은 다음에 대해 평가됩니다. 에 따르면 진실파이썬규칙. 즉, 0과 빈 문자열은 false이지만 특히'f'사실입니다.

  • 토토 핫 반환 유형이 다음과 같은 경우바이테아, 반환 값은 각각을 사용하는 문자열(Python 2) 또는 바이트(Python 3) 결과가 변환되는 Python 내장바이테아.

  • 다른 모든 토토 핫 반환 유형의 경우 반환된 Python 값은 Python을 사용하여 문자열로 변환됩니다. 내장str, 결과는 다음과 같습니다. 토토 핫 데이터의 입력 함수에 전달됨 유형.

    Python 2의 문자열은 토토 핫에 있어야 합니다. 토토 핫로 전달될 때 서버 인코딩. 문자열 현재 서버 인코딩에서 유효하지 않은 것은 오류가 발생하지만 모든 인코딩 불일치가 발생할 수 있는 것은 아닙니다. 감지되지 않았더라도 가비지 데이터가 계속 발생할 수 있습니다. 올바르게 수행되었습니다. 유니코드 문자열은 다음으로 변환됩니다. 인코딩을 자동으로 수정하므로 더 안전하고 더 많은 작업을 수행할 수 있습니다. 그것들을 사용하는 것이 편리합니다. Python 3에서는 모든 문자열이 유니코드 문자열.

  • 비스칼라 데이터 유형에 대해서는 아래를 참조하세요.

선언된 토토 핫 간의 논리적 불일치에 유의하세요. 반환 유형과 실제 반환의 Python 데이터 유형 개체에 플래그가 지정되지 않았습니다. 값은 어떤 방식으로든 변환됩니다. 경우.

42.3.2. 널, 없음

SQL null 값이 함수에 전달되면 인수는 값은 다음과 같이 표시됩니다.없음파이썬에서. 예를 들어, 다음의 함수 정의는파이맥스표시됨섹션 42.2잘못된 결과를 반환할 것입니다 null 입력에 대한 답변입니다. 추가할 수도 있습니다STRICT만들 함수 정의에토토 핫뭔가 더 해라 합리적: null 값이 전달되면 함수는 실행되지 않습니다. 전혀 호출되지 않았지만 null 결과만 반환합니다. 자동으로. 또는 다음에서 null 입력을 확인할 수 있습니다. 함수 본문:

CREATE FUNCTION pymax (a 정수, b 정수)
  정수를 반환합니다.
AS $$
  (a가 없음) 또는 (b가 없음)인 경우:
    반환 없음
  a  b인 경우:
    반환하다
  b를 돌려주다
$$ 언어 plpythonu;

위에 표시된 대로 PL/Python에서 SQL null 값을 반환하려면 함수, 값을 반환합니다.없음. 이 기능이 엄격한지 여부에 관계없이 수행될 수 있습니다.

42.3.3. 배열, 목록

SQL 배열 값은 Python 목록으로 PL/Python에 전달됩니다. PL/Python 함수에서 SQL 배열 값을 반환하려면, Python 시퀀스(예: 목록 또는 튜플)를 반환합니다.

함수 생성 return_arr()
  반환 정수[]
AS $$
반환 (1, 2, 3, 4, 5)
$$ 언어 plpythonu;

SELECT return_arr();
 return_arr  
-------------
 1,2,3,4,5

파이썬에서 문자열은 시퀀스이며 다음을 가질 수 있습니다. Python에 익숙할 수 있는 바람직하지 않은 효과 프로그래머:

함수 생성 return_str_arr()
  varchar[]를 반환합니다.
AS $$
"안녕하세요"를 반환
$$ 언어 plpythonu;

SELECT return_str_arr();
 return_str_arr
----------------
 h,e,l,l,o

42.3.4. 복합 유형

복합 유형 인수는 다음과 같이 함수에 전달됩니다. 파이썬 매핑. 매핑의 요소 이름은 다음과 같습니다. 복합 유형의 속성 이름. 다음의 속성인 경우 전달된 행에 null 값이 있고 값이 있습니다.없음매핑에 있습니다. 예는 다음과 같습니다.

CREATE TABLE 직원(
  이름 텍스트,
  급여 정수,
  연령 정수
);

CREATE FUNCTION 초과 지급(e 직원)
  반환 부울
AS $$
  e["salary"]  200000인 경우:
    True를 반환
  if (e["age"] < 30) 및 (e["salary"]  100000):
    True를 반환
  거짓을 반환
$$ 언어 plpythonu;

행 또는 복합 유형을 반환하는 방법에는 여러 가지가 있습니다 Python 함수에서. 다음 예에서는 다음과 같이 가정합니다. 가지고 있는 것:

CREATE TYPE 명명된_값 AS(
  이름 텍스트,
  값 정수
);

복합 결과는 다음과 같이 반환될 수 있습니다:

시퀀스 유형(튜플 또는 리스트이지만 세트가 아님. 왜냐하면 색인 생성이 불가능합니다)

반환된 시퀀스 개체에는 동일한 수의 개체가 있어야 합니다. 복합 결과 유형인 항목에는 필드가 있습니다. 항목 인덱스 0이 있는 필드가 첫 번째 필드에 할당됩니다. 복합 유형, 1에서 두 번째 등. 에 대한 예:

CREATE FUNCTION make_pair(이름 텍스트, 값 정수)
  명명된_값을 반환합니다.
AS $$
  return [ 이름, 값 ]
  # 또는 튜플로: return ( name, value )
$$ 언어 plpythonu;

모든 열에 대해 SQL null을 반환하려면 다음을 삽입하십시오.없음해당 위치에.

매핑(사전)

각 결과 유형 열의 값이 검색됩니다. 열 이름을 키로 사용하여 매핑에서. 예:

CREATE FUNCTION make_pair(이름 텍스트, 값 정수)
  명명된_값을 반환합니다.
AS $$
  return  "이름": 이름, "값": 값

추가 사전 키/값 쌍은 무시됩니다. 누락된 키는 오류로 처리됩니다. SQL null을 반환하려면 모든 열의 값, 삽입없음해당 열 이름을 키로 사용합니다.

객체(메서드를 제공하는 모든 객체__getattr__)

이것은 매핑과 동일하게 작동합니다. 예:

CREATE FUNCTION make_pair(이름 텍스트, 값 정수)
  명명된_값을 반환합니다.
AS $$
  클래스 이름_값:
    def __init__ (self, n, v):
      self.name = n
      자기값 = v
  명명된_값(이름, 값)을 반환합니다.

  # 또는 단순히
  클래스 NV: 통과
  nv.name = 이름
  nv.value = 값
  네바다 반납
$$ 언어 plpythonu;

함수아웃매개변수는 또한 지원됩니다. 예를 들면:

CREATE FUNCTION multiout_simple(OUT i 정수, OUT j 정수) AS $$
반환 (1, 2)
$$ 언어 plpythonu;

SELECT * FROM multiout_simple();

42.3.5. 집합 반환 함수

A PL/파이썬함수는 또한 스칼라 또는 복합 유형 세트를 반환합니다. 있다 반환된 객체는 다음과 같기 때문에 이를 달성하는 여러 가지 방법이 있습니다. 내부적으로 반복자로 바뀌었습니다. 다음 예 복합 유형이 있다고 가정합니다.

다음 유형의 인사말 작성(
  어떻게 텍스트,
  누가 문자를 보내?
);

설정된 결과는 다음에서 반환될 수 있습니다:

시퀀스 유형(튜플, 리스트, 세트)
CREATE FUNCTION 인사말(텍스트 방법)
  RETURN SETOF 인사말
AS $$
  # 목록을 복합 유형으로 포함하는 튜플을 반환합니다.
  # 다른 모든 조합도 작동합니다
  return ( [ 방법, "세계" ], [ 방법, "토토 핫" ], [ 방법, "PL/Python" ] )
$$ 언어 plpythonu;
반복자(제공하는 모든 객체__iter__그리고다음메서드)
CREATE FUNCTION 인사말(텍스트 방법)
  RETURN SETOF 인사말
AS $$
  클래스 프로듀서:
    def __init__ (자신, 어떻게, 누구):
      self.how = 어떻게
      self.who = 누구
      self.ndx = -1

    def __iter__ (자체):
      자기 자신을 돌려보내다

    def 다음 (자기):
      self.ndx += 1
      self.ndx == len(self.who)인 경우:
        StopIteration 높이기
      반환( self.how, self.who[self.ndx] )

  반환 생산자(방법, [ "World", "토토 핫", "PL/Python" ])
$$ 언어 plpythonu;
생성기 (수율)
CREATE FUNCTION 인사말(텍스트 방법)
  RETURN SETOF 인사말
AS $$
  [ "World", "토토 핫", "PL/Python" ]에서 누구를 위해:
    산출물(어떻게, 누가)
$$ 언어 plpythonu;
경고

파이썬으로 인해버그 #1483133, 일부 디버그 버전 Python 2.4(옵션으로 구성 및 컴파일됨)--with-pydebug)은 충돌하는 것으로 알려져 있습니다.포스트그레SQL서버 사용 시 설정된 결과를 반환하는 반복자입니다. 패치되지 않음 Fedora 4 버전에는 이 버그가 포함되어 있습니다. 그렇습니다 Python의 프로덕션 버전이나에서는 발생하지 않습니다. Fedora 4의 패치 버전.

설정 반환 함수아웃매개변수(사용SETOF를 반환합니다. 기록)도 지원됩니다. 예를 들면:

CREATE FUNCTION multiout_simple_setof(n 정수, OUT 정수, OUT 정수) SETOF 레코드 AS $$를 반환합니다.
반환 [(1, 2)] * n
$$ 언어 plpythonu;

SELECT * FROM multiout_simple_setof(3);