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;
}
테이블 이름을 대문자로 지정할 필요가 없습니다. Oracle SQL은 대소 문자를 구별하지 않는 한 대소 문자를 구분합니다. – user272735
table_name = actor로 sys.all_tables를 선택하면 아무 것도 반환하지 않아 조건이 false로 변환되고 테이블이 삭제되지 않지만 대문자로도 작동합니다 – TonyaLepski
'table_name ='SOME_TABLE '에 대해 UpperCase가 필요합니다 문자열 자체는 대소 문자를 구분하지 않습니다. 언급 할 가치가있는 모든 DB 객체는 바인딩 변수로 사용할 수 없습니다. 이것이 바로 테이블 이름을 바인드하는 대신 문자열을 형성하는 이유입니다. 그리고 DDL에 대한 variable__bind는 실제로 다른 논의입니다! –