2012-08-06 4 views
2

Perl DBI를 사용하여 데이터베이스를 기반으로 뷰를 자동 생성하려고합니다. 관련 코드는 perl DBI를 사용하여 뷰를 생성 할 때 매개 변수를 전달할 수 없습니다.

my $dbh  = DBI->connect("dbi:Oracle:$database", $user_passwd); 
my $Directive = q{ CREATE OR REPLACE VIEW SOME_VIEW AS SELECT * FROM ID_TABLE WHERE ID=?}; 
my $ID = 12345; 

my $sth = $dbh->prepare($Directive); 
my $rv = $sth->execute($ID); 

그럼 내가 코드를 실행 한 후 $rv 항상 undef입니다 발견, 다음과 같다. 코드에서 내가 잘못 만들었습니까? $Directive에 매개 변수를 직접 입력하면 모든 것이 좋습니다.

나는 "SELECT * FROM ID_TABLE WHERE ID =?"와 같이 다른 $ 지시문을 사용할 때 매개 변수 $ ID가 문제없이 전달 될 수 있습니다.

+1

'RaiseError => 1'을 사용하여 연결을 시도하십시오. 일부 드라이버는보기에서 매개 변수를 지원하지 않습니다 (오라클에 대해서는 확실하지 않습니다). – choroba

답변

2

SQL은 예제와 같이 조건에 플레이스 홀더가있는보기를 만들 수 없습니다. 그 외에는 뷰를 참조 할 때 자리 표시 자의 값을 지정할 수있는 표기법이 없습니다. 일반적으로 DDL 문은 입력 매개 변수를 사용하지 않습니다.

당신은 일을 다르게해야 할 것입니다.

이것은 Perl이나 DBI 그 자체 나 사용하고있는 특정 DBMS의 제한이 아닙니다. 전체적으로 SQL을 디자인 할 때 문제가됩니다. 이 특정한 경우에 대처하기 위해


많은 간단한 방법은 다음과 같습니다

my $dbh = DBI->connect("dbi:Oracle:$database", $user_passwd); 
my $ID = 12345; 
my $sql = qq{ CREATE OR REPLACE VIEW SOME_VIEW AS SELECT * FROM ID_TABLE WHERE ID = $ID }; 

my $sth = $dbh->prepare($sql); 
my $rv = $sth->execute(); 

은 간단하게 준비하고 실행하는 SQL 문에있는 매개 변수의 값을 포함.

+0

귀하의 즉각적인 답변을 주신 Jonathan에게 감사드립니다. 자동으로보기를 사용하지 않고 지나갈 길을 찾아야합니다. – user1579740

+0

다음과 같은 방법으로 재 시도했습니다. my $ dbh = DBI-> connect ("dbi : Oracle : $ database", $ user_passwd); my $ 지시문 = q {SELECT * FROM ID_TABLE WHERE ID =?};로 SOME_VIEW를 생성 또는 교체하십시오. my $ ID = '12345'; my $ sth = $ dbh-> prepare ($ 지시문. $ ID); my $ rv = $ sth-> execute(); ... 코드의이 부분은 잘 작동합니다. 여기에서 함수 $ stch-> execute()는 매개 변수를 어디에 있어야하는지 알 수 없습니다. 열광한. – user1579740

+0

RaiseError를 연결에 추가하면 execute를 호출 할 때 "ORA-01027 : 데이터 정의 연산에 바인드 변수가 허용되지 않음"과 같은 결과가 표시됩니다. 조나단의 게시물을 다시 읽으십시오 - 당신이하려는 일을 할 수 없습니다 - 오라클은 당신을 허용하지 않습니다. – bohica