Выполнение файла oracle. sql с php - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь выполнить простой. sql файл, который сбрасывает мою базу данных. Он отлично работает, когда я запускаю его в sqlplus с @, но возвращает ORA-00922: missing or invalid option, когда я запускаю его с использованием php следующим образом:

$query = file_get_contents($path);
$stid = oci_parse($con, $query);
$r = oci_execute($stid);

Вот сам файл. sql, это довольно просто, и я просто не могу найти ничего плохого в командах:

ALTER SESSION SET NLS_LANGUAGE = AMERICAN;
ALTER SESSION SET NLS_TERRITORY = AMERICA;

DROP TABLE users;
DROP TABLE friends;
DROP TABLE replies;
DROP TABLE tweets;
DROP TABLE retweets;
DROP TABLE mentions;
DROP TABLE hashtags;

CREATE TABLE users (
    id_str VARCHAR2(20) NOT NULL PRIMARY KEY,
    name VARCHAR2(40) NOT NULL,
    screen_name VARCHAR2(20) NOT NULL,
    followers NUMBER(9) NOT NULL,
    friends NUMBER(9) NOT NULL
);

CREATE TABLE friends (
    id1_str VARCHAR2(20) NOT NULL,
    id2_str VARCHAR2(20) NOT NULL,
    CONSTRAINT friendship PRIMARY KEY (id1_str, id2_str)
);

CREATE TABLE replies (
    id1_str VARCHAR2(20) NOT NULL,
    id2_str VARCHAR2(20) NOT NULL,
    CONSTRAINT reply PRIMARY KEY (id1_str, id2_str)
);

CREATE TABLE tweets (
    id_str VARCHAR2(20) NOT NULL PRIMARY KEY,
    user_id_str VARCHAR2(20) NOT NULL,
    created DATE NOT NULL
);

CREATE TABLE retweets (
    user_id_str VARCHAR2(20) NOT NULL,
    tweet_id_str VARCHAR2(20) NOT NULL,
    CONSTRAINT retweet PRIMARY KEY (user_id_str, tweet_id_str)
);

CREATE TABLE hashtags (
    tweet_id_str VARCHAR2(20) NOT NULL,
    text VARCHAR2(140) NOT NULL,
    CONSTRAINT hashtag PRIMARY KEY (tweet_id_str, text)
);

CREATE TABLE mentions (
    user_id_str VARCHAR2(20) NOT NULL,
    tweet_id_str VARCHAR2(20) NOT NULL,
    CONSTRAINT mention PRIMARY KEY (user_id_str, tweet_id_str)
);

COMMIT;

Я знаю, что это, вероятно, глупо, но я часами искал решение безрезультатно и был бы признателен за любые советы (даже другой способ, чем загрузка этого файла).

1 Ответ

3 голосов
/ 27 января 2020

Проблема проста. Ваш файл содержит несколько команд, и oci_parse предназначен для работы с отдельными операторами.

У вас есть два варианта:

  1. Читать файл, анализировать его для точек с запятой и передайте каждую результирующую строку (минус точка с запятой) в oci_parse / oci_execute или
  2. Измените файл так, чтобы он был действительным блоком PL / SQL, с BEGIN в начале и END; в конце, с каждым из операторов DDL, которые вы хотите выполнить в EXECUTE IMMEDIATE, как показано ниже:
    BEGIN
      EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_LANGUAGE = AMERICAN';
      EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY = AMERICA';

      EXECUTE IMMEDIATE 'DROP TABLE users';
      EXECUTE IMMEDIATE 'DROP TABLE friends';
      EXECUTE IMMEDIATE 'DROP TABLE replies';
      EXECUTE IMMEDIATE 'DROP TABLE tweets';
      EXECUTE IMMEDIATE 'DROP TABLE retweets';
      EXECUTE IMMEDIATE 'DROP TABLE mentions';
      EXECUTE IMMEDIATE 'DROP TABLE hashtags';

      EXECUTE IMMEDIATE 'CREATE TABLE users (
          id_str VARCHAR2(20) NOT NULL PRIMARY KEY,
          name VARCHAR2(40) NOT NULL,
          screen_name VARCHAR2(20) NOT NULL,
          followers NUMBER(9) NOT NULL,
          friends NUMBER(9) NOT NULL
      )';

      EXECUTE IMMEDIATE 'CREATE TABLE friends (
          id1_str VARCHAR2(20) NOT NULL,
          id2_str VARCHAR2(20) NOT NULL,
          CONSTRAINT friendship PRIMARY KEY (id1_str, id2_str)
      )';

      EXECUTE IMMEDIATE 'CREATE TABLE replies (
          id1_str VARCHAR2(20) NOT NULL,
          id2_str VARCHAR2(20) NOT NULL,
          CONSTRAINT reply PRIMARY KEY (id1_str, id2_str)
      )';

      EXECUTE IMMEDIATE 'CREATE TABLE tweets (
          id_str VARCHAR2(20) NOT NULL PRIMARY KEY,
          user_id_str VARCHAR2(20) NOT NULL,
          created DATE NOT NULL
      )';

      EXECUTE IMMEDIATE 'CREATE TABLE retweets (
          user_id_str VARCHAR2(20) NOT NULL,
          tweet_id_str VARCHAR2(20) NOT NULL,
          CONSTRAINT retweet PRIMARY KEY (user_id_str, tweet_id_str)
      )';

      EXECUTE IMMEDIATE 'CREATE TABLE hashtags (
          tweet_id_str VARCHAR2(20) NOT NULL,
          text VARCHAR2(140) NOT NULL,
          CONSTRAINT hashtag PRIMARY KEY (tweet_id_str, text)
      )';

      EXECUTE IMMEDIATE 'CREATE TABLE mentions (
          user_id_str VARCHAR2(20) NOT NULL,
          tweet_id_str VARCHAR2(20) NOT NULL,
          CONSTRAINT mention PRIMARY KEY (user_id_str, tweet_id_str)
      )';
    END;
...