Вы можете поместить все ваши операторы create в таблицу temp1, которую вы можете создавать и вставлять, используя oci_parse и oci_execute, а затем вы можете использовать блок PL SQL для запуска вашего кода, используя oci_parse и oci_execute. Кроме того, удалите точку с запятой, где это необходимо.
Step1
CREATE TABLE temp1
(
id NUMBER,
sql_text CLOB
);
Step2
BEGIN
INSERT INTO temp1
VALUES (1,
'drop table t2 ;drop table t3;');
INSERT INTO temp1
VALUES (2,
'create table t2 (t number);create table t3 (t1 number);');
END;
Step3
BEGIN
FOR rec IN (SELECT blk.id,
TRIM(Regexp_substr(sql_text, '[^;]+', 1, lvl)) sql_text
FROM (SELECT DISTINCT id,
LEVEL lvl
FROM temp1
CONNECT BY LEVEL <= Regexp_count(Trim(sql_text), '[^;]+'
))
blk,
temp1
WHERE blk.id = temp1.id
ORDER BY blk.id,
lvl) LOOP
BEGIN
EXECUTE IMMEDIATE rec.sql_text;
EXCEPTION
WHEN OTHERS THEN
dbms_output.Put_line(SQLERRM);
END;
END LOOP;
END;
или вы можете объединить все три в один блок PL SQL и вызвать oci_parse и oci_execute
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE temp1';
EXECUTE IMMEDIATE ' CREATE TABLE temp1
(
id NUMBER,
sql_text CLOB
)';
INSERT INTO temp1
VALUES (1,
'drop table t2 ;drop table t3;');
INSERT INTO temp1
VALUES (2,
'create table t2 (t number);create table t3 (t1 number);');
FOR rec IN (SELECT blk.id,
TRIM(Regexp_substr(sql_text, '[^;]+', 1, lvl)) sql_text
FROM (SELECT DISTINCT id,
LEVEL lvl
FROM temp1
CONNECT BY LEVEL <= Regexp_count(Trim(sql_text), '[^;]+'
))
blk,
temp1
WHERE blk.id = temp1.id
ORDER BY blk.id,
lvl) LOOP
BEGIN
EXECUTE IMMEDIATE rec.sql_text;
EXCEPTION
WHEN OTHERS THEN
dbms_output.Put_line(SQLERRM);
END;
END LOOP;
END;