2017-01-30 11 views
0

PostgreSQL에서 변수를 설정하기 위해 Hasql을 사용하여 매개 변수화 된 명령문을 작성하려고합니다.Hasql : 'SET'문에서 변수 대체 오류가 발생했습니다.

import qualified Hasql.Encoders as E 
import qualified Hasql.Decoders as D 

setOrganization :: Query Int64() 
setOrganization = statement sql (E.value E.int8) D.unit False 
    where 
    sql = "set my_session.organization_id = $1" 

위의 결과는 다음과 같습니다

ResultError (ServerError "42601" "syntax error at or near \"$1\"" Nothing Nothing) 

는 예를 들어, 작은 따옴표를 추가 organization_idbigint/int8 때문에 이해하지

ResultError (ServerError "22P02" "invalid input syntax for integer: \"$1\"" Nothing Nothing) 

: 나는 변수를 사용하여 쿼리를 실행할 때

sql = "set my_session.organization_id = '$1'" 

는이 결과를 제공합니다.

어느 형식 으로든 $1 값을 하드 코딩하면됩니다. 나는 다른 Hasql 유형을 시도했다. E.textE.unknown이며 작동하지 않습니다.


업데이트 : postgresql-libpq에서 원시적 execParams 기능을 사용.

execParams c "SET my_session.organization_id = '$1'" [Just (Oid 20, "1",Text)] Text 

인용 부호가없는 변수는 FatalError 결과를 제공합니다. 작은 따옴표로 묶인 변수는 CommandOk으로 표시되지만 나중에 쿼리 할 때는 잘못된 형식 (bigint 아님)입니다.

+0

오류 메시지는 '$ 1'장소 소유자가 대체되지 않음을 나타냅니다. –

+0

오류보고는 변수 대체가 없다고 생각합니다. '$ 1' 자리 표시 자 형식을 사용하면'$ 1 + 4 '에 사용할 수 있으므로 형식이 괜찮습니다. – Mikkel

답변

2

SET 명령은 준비된 문과 함께 사용할 수 없습니다. 이것은 PostgreSQL의 한계입니다. A prepared statement은 다양한 매개 변수 값을 사용하여 여러 번 실행될 수있는 선택적 매개 변수가있는 명령문입니다. 매개 변수가있는 모든 명령문은 PostgreSQL에서 준비된 명령문입니다. 명령문을 한 번만 실행하거나 재사용을 위해 이름을 지정하는 경우에도 관계 없습니다.

상수 값을 사용하여 쿼리 문자열을 구성하고 실행해야합니다.

또는 동적 SQL을 사용하여 set 명령을 실행하는 PostgreSQL에 함수를 작성하고 준비된 SELECT 문에서 해당 함수를 매개 변수로 호출 할 수 있습니다.

+0

'False'를 포함하고 있기 때문에 쿼리는 준비된 명령문 대신에 매개 변수화 된 쿼리를 사용합니다 (이 함수는'libpq', https://www.postgresql.org/docs/9.5/static/libpq-exec.html에 있습니다). # LIBPQ-PQEXECPARAMS). 작은 따옴표로 SET 쿼리를 실행하면'commandOk'가 반환됩니다. – Mikkel

+1

@Mikkel Laurenz가 의미하는 바는'SET'을 * 매개 변수식 문과 함께 사용할 수 없다는 것입니다. IOW, 그 문장에 값을 하드 코딩해야합니다. 이 제한은 Postgres에서 제공되며 Hasql에서는 제공되지 않습니다. –