Как удалить и создать Oracle таблиц базы данных в PHP - PullRequest
1 голос
/ 28 марта 2020

У меня есть код, который создает всю мою базу данных с 13 таблицами.

Я хотел бы добавить возможность отбрасывать эти таблицы (уже есть) и добавлять их новые и пустые.

My код:

include 'connection.php';

$c = oci_connect($username, $password, $database);
if (!$c) {
    $m = oci_error();
    trigger_error('Could not connect to database: '. $m['message'], E_USER_ERROR);
}

$createDb = "CREATE TABLE adres (
    adresid        INTEGER NOT NULL,
    miasto         VARCHAR2(50 CHAR),
    ulica          VARCHAR2(50 CHAR),
    kod_pocztowy   CHAR(11 CHAR),
    nr_mieszkania  CHAR(5 CHAR),
    nr_domu        CHAR(5 CHAR)
);";

$ex = oci_parse($c,$createDb);
oci_execute($ex);

В ответ я получил предупреждение:

Warning: oci_execute(): ORA-00922: missing or invalid option

1 Ответ

0 голосов
/ 29 марта 2020

Вы можете поместить все ваши операторы 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; 
...