, . , Oracle prepare (MySQL ). :
my $dbh = DBI->connect(
"dbi:Oracle:dbname",
"username",
"password",
{
ChopBlanks => 1,
AutoCommit => 1,
RaiseError => 1,
PrintError => 1,
FetchHashKeyName => 'NAME_lc',
}
);
$dbh->do("
CREATE TABLE test_dbi1 (
test_dbi_intr_no NUMBER(15),
test_dbi_name VARCHAR2(100)
);
UPDATE mytable
SET col1=1;
CREATE TABLE test_dbi2 (
test_dbi_intr_no NUMBER(15),
test_dbi_name VARCHAR2(100)
);
");
$dbh->disconnect;
, , . , :
use strict;
use warnings;
my $sql = "
CREATE TABLE test_dbi1 (
test_dbi_intr_no NUMBER(15),
test_dbi_name VARCHAR2(100)
);
UPDATE mytable
SET col1=';yes;'
WHERE col2=1;
UPDATE mytable
SET col1='Don\\'t use ;s and \\ together, it is a pain'
WHERE col2=1;
CREATE TABLE test_dbi2 (
test_dbi_intr_no NUMBER(15),
test_dbi_name VARCHAR2(100)
);
";
my @statements = ("");
my @tokens = grep { ord } split /([\\';])/, $sql;
my $in_string = 0;
my $escape = 0;
while (@tokens) {
my $token = shift @tokens;
if ($in_string) {
$statements[-1] .= $token;
if ($token eq "\\") {
$escape = 1;
next;
}
$in_string = 0 if not $escape and $token eq "'";
$escape = 0;
next;
}
if ($token eq ';') {
push @statements, "";
next;
}
$statements[-1] .= $token;
$in_string = 1 if $token eq "'";
}
@statements = grep { /\S/ } @statements;
for my $i (0 .. $#statements) {
print "statement $i:\n$statements[$i]\n\n";
}