2017-05-05 18 views
-1

配列、refおよび結合された文字列をOracle 11.2のIN句に渡そうとするすべてのオプションを使い果たしました。私はたいていの場合、 "文書化されていない変換"または "恐らく< *>"のインジケータエラーが発生します。Perl配列をOracleに渡すIN句の準備クエリ

Oracle DBのprepare文のIN句に配列を渡す最適な方法は何ですか?

プリペアドクエリは次のようになります

$query = "select * from xyz join abc on xyz.t=abc.t where xyz.a IN ?"; 
$query_stmt = $dbh->prepare($query); 
$query_stmt->execute(ARRAY(0x11223344) ||(other tried option) 'string0,string1,...'); 

エラー:

DBD::Oracle::st execute failed: ORA-01460: unimplemented or unreasonable conversion requested (DBD ERROR: OCIStmtExecute) [for Statement "select 
       distinct cast(vt.a as varchar2(30)) 
        as a, 
       trim(to_char(value)) as b 
      from xyz vt 
      join abc vtc on vt.c 
      = vtc.c join w offer 
       on vt.d = offer.d 
       and vt.is_valid = 'Y' 
      where vt.a IN (?)" with ParamValues: :p1=''6778168456141','6778179729141','6778200266141','6778203754141','6778208407141','6778224280141','6778224419141','6778236126141','6778249749141','6778256663141','6778260054141','6778276276141','6778285860141','6778317622141','32141','6778341014141','6778347921141','6778365313141','6778370737141','6778404039141','6778405686141','6778424024141','6778443116141','6778481089141','6778529277141','6778538345141','6778591334141','6778595317141','6778619981141','6778692874141','6778767142141','6778778071141','6778797829141','6778816085141','6778867467141','6778883297141','6778895665141','6778978652141','6778996314141','6779024581141','6779081179141','6779119698141','6779125079141','6779128574141','6779128584141','6779128649141','6779128662141','6779128724141','6779142735141','6779146125141','6779146399141','6779152708141','6779153278141','6779163438141','6779164599141','6779168905141','6779187230141','6779210491141','6779278671141','6779288166141','6779304879141','6779328703141','67...'] 

答えて

5

Oracleデータベースドライバは、私が知らないことをそれを行うにはいくつかの他の方法を提供しない限り、あなたがする必要がありますそれぞれの要素に別のプレースホルダを使用してください:

$query = sprintf 'select * from xyz join abc on xyz.t=abc.t where xyz.a in (%s)', 
    join ',', ('?') x @array; 
$query_stmt = $dbh->prepare($query); 
$query_stmt->execute(@array); 
+0

これを試してみます。私は前にこれに似た何かを試みたが、それは働かなかった。 –

+0

ここでは、置換されたすべての値に対して「undef」と設定されています[:p997 = undef、:p998 = undef、:p999 = undef] –

+5

実際のコードで質問を更新します – ysth

関連する問題