2014-08-28 9 views
2

DBD::Oracle을 사용하여 PL/SQL 코드를 실행하려고합니다. 오류없이 실행되지만 테이블은 삭제되지 않습니다. 동적에 직접 넣을 때 동적 SQL은 변수로 :ts을 인식하지 않기 때문에DBD :: Oracle - PL/SQL 블록이 작동하지 않습니다.

my @tabs = qw!actor address category city country customer film film_features 
film_actor film_category film_text inventory language payment rental staff 
store!; 

for my $ts (@tabs){ 

    my $csr = $ora->prepare(q{ 
     DECLARE 
       var_count INT; 
     BEGIN 
      SELECT COUNT(*) INTO var_count 
      FROM sys.all_tables WHERE OWNER = 'SAKILA' AND table_name = :ts ; 
       if var_count > 0 then 
        EXECUTE IMMEDIATE 'DROP TABLE :ts CASCADE CONSTRAINTS' ; 
       end if; 
      END; 
    }); 
    $csr->bind_param(":ts", $ts); 
    $csr->execute; 

} 

답변

3

1 위 - 대문자로

2 번 테이블 목록을 변경 - 변경 :

TO

EXECUTE IMMEDIATE 'DROP TABLE :ts CASCADE CONSTRAINTS' ; 

FROM : 여기
EXECUTE IMMEDIATE 'DROP TABLE '||:ts||' CASCADE CONSTRAINTS' ; 

가 가득 코드 :

my @tabs = qw!ACTOR ADDRESS CATEGORY CITY COUNTRY CUSTOMER FILM FILM_FEATURES FILM_ACTOR FILM_CATEGORY FILM_TEXT INVENTORY LANGUAGE PAYMENT RENTAL STAFF STORE!; 
    for my $ts (@tabs){ 
    chomp $ts; 
    my $csr = $ora->prepare(q{ 
     DECLARE 
      var_count INT; 
     BEGIN 
      SELECT COUNT(*) INTO var_count 
      FROM sys.all_tables WHERE OWNER = 'SAKILA' AND table_name = :ts ; 
      if var_count > 0 then 
       EXECUTE IMMEDIATE 'DROP TABLE '||:ts||' CASCADE CONSTRAINTS' ; 
      end if; 
     END; 
    }); 
$csr->bind_param(":ts", $ts); 
$csr->execute; 
} 
+0

테이블 이름을 대문자로 지정할 필요가 없습니다. Oracle SQL은 대소 문자를 구별하지 않는 한 대소 문자를 구분합니다. – user272735

+1

table_name = actor로 sys.all_tables를 선택하면 아무 것도 반환하지 않아 조건이 false로 변환되고 테이블이 삭제되지 않지만 대문자로도 작동합니다 – TonyaLepski

+1

'table_name ='SOME_TABLE '에 대해 UpperCase가 필요합니다 문자열 자체는 대소 문자를 구분하지 않습니다. 언급 할 가치가있는 모든 DB 객체는 바인딩 변수로 사용할 수 없습니다. 이것이 바로 테이블 이름을 바인드하는 대신 문자열을 형성하는 이유입니다. 그리고 DDL에 대한 variable__bind는 실제로 다른 논의입니다! –

2

내가

EXECUTE IMMEDIATE 'DROP TABLE :ts CASCADE CONSTRAINTS'; 

EXECUTE IMMEDIATE 'DROP TABLE '||:ts||' CASCADE CONSTRAINTS'; 

을 대체 할 것이다 : 여기

코드입니다 질문.

+0

이것은 두 가지 문제 중 하나만 해결합니다. @ user3658506은 두 가지 문제를 모두 해결했습니다. – user272735

+0

그래, 나는 테이블 이름이 대문자가 아니라는 것을 알아 차리지 못했다. 그런 다음 WHERE 절과 동적 SQL 쿼리에서': ts'를'UPPER (: ts)'로 변경합니다. – yamny