From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/perl
use strict;
use FindBin qw/$Bin/;
BEGIN {
maybe_plan(2, 'SQL::Translator::Parser::XML::SQLFairy', 'SQL::Translator::Producer::Oracle');
}
my $xmlfile = "$Bin/data/xml/schema.xml";
my $sqlt;
$sqlt = SQL::Translator->new(
no_comments => 1,
quote_table_names => 0,
quote_field_names => 0,
show_warnings => 0,
add_drop_table => 1,
);
die "Can't find test schema $xmlfile" unless -e $xmlfile;
my @sql = $sqlt->translate(
from => 'XML-SQLFairy',
to => 'Oracle',
filename => $xmlfile,
) or die $sqlt->error;
my $sql_string = $sqlt->translate(
from => 'XML-SQLFairy',
to => 'Oracle',
filename => $xmlfile,
) or die $sqlt->error;
my $want = [
'DROP TABLE Basic CASCADE CONSTRAINTS',
'DROP SEQUENCE sq_Basic_id',
'CREATE SEQUENCE sq_Basic_id',
'CREATE TABLE Basic (
id number(10) NOT NULL,
title varchar2(100) DEFAULT \'hello\' NOT NULL,
description clob DEFAULT \'\',
email varchar2(500),
explicitnulldef varchar2(4000),
explicitemptystring varchar2(4000) DEFAULT \'\',
emptytagdef varchar2(4000) DEFAULT \'\',
another_id number(10) DEFAULT \'2\',
timest date,
PRIMARY KEY (id),
CONSTRAINT u_Basic_emailuniqueindex UNIQUE (email),
CONSTRAINT u_Basic_very_long_index_name_o UNIQUE (title)
)',
'DROP TABLE Another CASCADE CONSTRAINTS',
'DROP SEQUENCE sq_Another_id',
'CREATE SEQUENCE sq_Another_id',
'CREATE TABLE Another (
id number(10) NOT NULL,
num number(10,2),
PRIMARY KEY (id)
)',
'DROP VIEW email_list',
'CREATE VIEW email_list AS
SELECT email FROM Basic WHERE (email IS NOT NULL)',
'ALTER TABLE Basic ADD CONSTRAINT Basic_another_id_fk FOREIGN KEY (another_id) REFERENCES Another (id)',
'CREATE OR REPLACE TRIGGER ai_Basic_id
BEFORE INSERT ON Basic
FOR EACH ROW WHEN (
new.id IS NULL OR new.id = 0
)
BEGIN
SELECT sq_Basic_id.nextval
INTO :new.id
FROM dual;
END;
',
'CREATE OR REPLACE TRIGGER ai_Another_id
BEFORE INSERT ON Another
FOR EACH ROW WHEN (
new.id IS NULL OR new.id = 0
)
BEGIN
SELECT sq_Another_id.nextval
INTO :new.id
FROM dual;
END;
',
'CREATE INDEX titleindex ON Basic (title)'
];
is_deeply(\@sql, $want, 'Got correct Oracle statements in list context');
eq_or_diff(
$sql_string, q|DROP TABLE Basic CASCADE CONSTRAINTS;
DROP SEQUENCE sq_Basic_id01;
CREATE SEQUENCE sq_Basic_id01;
CREATE TABLE Basic (
id number(10) NOT NULL,
title varchar2(100) DEFAULT 'hello' NOT NULL,
description clob DEFAULT '',
email varchar2(500),
explicitnulldef varchar2(4000),
explicitemptystring varchar2(4000) DEFAULT '',
emptytagdef varchar2(4000) DEFAULT '',
another_id number(10) DEFAULT '2',
timest date,
PRIMARY KEY (id),
CONSTRAINT u_Basic_emailuniqueindex01 UNIQUE (email),
CONSTRAINT u_Basic_very_long_index_name01 UNIQUE (title)
);
DROP TABLE Another CASCADE CONSTRAINTS;
DROP SEQUENCE sq_Another_id01;
CREATE SEQUENCE sq_Another_id01;
CREATE TABLE Another (
id number(10) NOT NULL,
num number(10,2),
PRIMARY KEY (id)
);
DROP VIEW email_list;
CREATE VIEW email_list AS
SELECT email FROM Basic WHERE (email IS NOT NULL);
ALTER TABLE Basic ADD CONSTRAINT Basic_another_id_fk01 FOREIGN KEY (another_id) REFERENCES Another (id);
CREATE INDEX titleindex01 ON Basic (title);
CREATE OR REPLACE TRIGGER ai_Basic_id01
BEFORE INSERT ON Basic
FOR EACH ROW WHEN (
new.id IS NULL OR new.id = 0
)
BEGIN
SELECT sq_Basic_id01.nextval
INTO :new.id
FROM dual;
END;
/
CREATE OR REPLACE TRIGGER ai_Another_id01
BEFORE INSERT ON Another
FOR EACH ROW WHEN (
new.id IS NULL OR new.id = 0
)
BEGIN
SELECT sq_Another_id01.nextval
INTO :new.id
FROM dual;
END;
/
|
);