Ошибка компиляции PLS-00103 при создании таблицы в процедуре - PullRequest
0 голосов
/ 09 ноября 2019

Я пишу код PL / SQL, который создает таблицу для базы данных.

Когда я пытаюсь отследить код, я получаю сообщение об ошибке PLS-00103. Я посмотрел на другие потоки, и он предлагает пропустить начало цикла, но я не могу видеть, где это может быть.

SET SERVEROUTPUT

EXECUTE THELLO;

 CREATE OR REPLACE PROCEDURE THELLO AS
    WELCOME VARCHAR(50);
BEGIN
    CREATE TABLE NEW_PART(
P_PARTKEY   NUMBER(12)  NOT NULL,
P_NAME      VARCHAR(55) NOT NULL,
P_MFGR      VARCHAR(25) NOT NULL,
P_BRAND     CHAR(10)    NOT NULL,
P_TYPE      VARCHAR(25) NOT NULL,
P_SIZE      NUMBER(12)  NOT NULL,
P_CONTAINER     CHAR(10)    NOT NULL,
P_RETAILPRICE   NUMBER(12,2)    NOT NULL,
P_COMMENT   VARCHAR(23) NOT NULL,
    CONSTRAINT NEW_PART_PEKEY PRIMARY KEY (P_PARTKEY),
    CONSTRAINT NEW_PART_CHECK1 CHECK(P_PARTKEY >= 0),
    CONSTRAINT NEW_PART_CHECK2 CHECK(P_SIZE >= 0),
    CONSTRAINT NEW_PART_CHECK3 CHECK(P_RETAILPRICE >= 0) );

CREATE TABLE NEW_SUPPLIER(
S_SUPPKEY   NUMBER(12)  NOT NULL,
S_NAME      CHAR(25)    NOT NULL,
S_ADDRESS   VARCHAR(40) NOT NULL,
S_NATIONKEY NUMBER(12)  NOT NULL,
S_PHONE     CHAR(15)    NOT NULL,
S_ACCTBAL   NUMBER(12,2)    NOT NULL,
S_COMMENT   VARCHAR(101)    NOT NULL,
    CONSTRAINT NEW_SUPPLIER_PKEY PRIMARY KEY (S_SUPPKEY),
    CONSTRAINT NEW_SUPPLIER_FKEY1 FOREIGN KEY (S_NATIONKEY)
        REFERENCES NATION(N_NATIONKEY),
    CONSTRAINT NEW_SUPPLIER_CHECK1 CHECK(S_SUPPKEY >= 0) );

CREATE TABLE NEW_PARTSUPP(
PS_PARTKEY  NUMBER(12)  NOT NULL,
PS_SUPPKEY  NUMBER(12)  NOT NULL,
PS_AVAILQTY NUMBER(12)  NOT NULL,
PS_SUPPLYCOST   NUMBER(12,2)    NOT NULL,
PS_COMMENT  VARCHAR(199)    NOT NULL,
    CONSTRAINT NEW_PARTSUPP_PKEY PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY),
    CONSTRAINT NEW_PARTSUPP_FKEY1 FOREIGN KEY (PS_PARTKEY)
        REFERENCES NEW_PART(P_PARTKEY),
    CONSTRAINT NEW_PARTSUPP_FKEY2 FOREIGN KEY (PS_SUPPKEY)
        REFERENCES NEW_SUPPLIER(S_SUPPKEY),
    CONSTRAINT NEW_PARTSUPP_CHECK1 CHECK(PS_PARTKEY >= 0),
    CONSTRAINT NEW_PARTSUPP_CHECK2 CHECK(PS_AVAILQTY >= 0),
    CONSTRAINT NEW_PARTSUPP_CHECK3 CHECK(PS_SUPPLYCOST >= 0) );

DECLARE

BEGIN

  FOR PARTKEY IN (SELECT DISTINCT PS_PARTKEY FROM PARTSUPP)
  LOOP
    INSERT INTO NEW_PART ( SELECT * 
                           FROM PART
                           WHERE P_PARTKEY = PARTKEY.PS_PARTKEY );
    COMMIT;
  END LOOP;

  FOR SUPPKEY IN (SELECT DISTINCT PS_SUPPKEY FROM PARTSUPP)
  LOOP
    INSERT INTO NEW_SUPPLIER ( SELECT * 
                               FROM SUPPLIER
                               WHERE S_SUPPKEY = SUPPKEY.PS_SUPPKEY );
    COMMIT;
  END LOOP;

  INSERT INTO NEW_PARTSUPP ( SELECT * 
                             FROM PARTSUPP 
                 WHERE PS_PARTKEY IN ( SELECT P_PARTKEY
                                                   FROM NEW_PART ) AND
                                   PS_SUPPKEY IN ( SELECT S_SUPPKEY
                                                   FROM NEW_SUPPLIER ) );
  COMMIT;
END THELLO;
/
show errors
prompt Done.

ПРОБЛЕМА:

PLS-00103: Обнаружен символ "CREATE" при ожидании одного из следующих действий: (в начале регистра объявляется завершение исключения конца для goto, если цикл mod null прагма повышение возвращает выбор обновления, в то время как с<< продолжить закрыть текущее удаление выборка блокировка вставка открытый откат набор точек сохранения sql выполнить фиксацию для очистки канала слияния json_value json_query json_object json_array </p>

1 Ответ

1 голос
/ 09 ноября 2019

Как я уже говорил, создание таблицы не может быть частью процедуры, если она не используется в EXECUTE IMMEDIATE.

Создайте таблицу отдельно перед созданием процедуры.

CREATE TABLE NEW_PART(
P_PARTKEY   NUMBER(12)  NOT NULL,
P_NAME      VARCHAR(55) NOT NULL,
P_MFGR      VARCHAR(25) NOT NULL,
P_BRAND     CHAR(10)    NOT NULL,
P_TYPE      VARCHAR(25) NOT NULL,
P_SIZE      NUMBER(12)  NOT NULL,
P_CONTAINER     CHAR(10)    NOT NULL,
P_RETAILPRICE   NUMBER(12,2)    NOT NULL,
P_COMMENT   VARCHAR(23) NOT NULL,
    CONSTRAINT NEW_PART_PEKEY PRIMARY KEY (P_PARTKEY),
    CONSTRAINT NEW_PART_CHECK1 CHECK(P_PARTKEY >= 0),
    CONSTRAINT NEW_PART_CHECK2 CHECK(P_SIZE >= 0),
    CONSTRAINT NEW_PART_CHECK3 CHECK(P_RETAILPRICE >= 0) );

CREATE TABLE NEW_SUPPLIER(
S_SUPPKEY   NUMBER(12)  NOT NULL,
S_NAME      CHAR(25)    NOT NULL,
S_ADDRESS   VARCHAR(40) NOT NULL,
S_NATIONKEY NUMBER(12)  NOT NULL,
S_PHONE     CHAR(15)    NOT NULL,
S_ACCTBAL   NUMBER(12,2)    NOT NULL,
S_COMMENT   VARCHAR(101)    NOT NULL,
    CONSTRAINT NEW_SUPPLIER_PKEY PRIMARY KEY (S_SUPPKEY),
    CONSTRAINT NEW_SUPPLIER_FKEY1 FOREIGN KEY (S_NATIONKEY)
        REFERENCES NATION(N_NATIONKEY),
    CONSTRAINT NEW_SUPPLIER_CHECK1 CHECK(S_SUPPKEY >= 0) );

CREATE TABLE NEW_PARTSUPP(
PS_PARTKEY  NUMBER(12)  NOT NULL,
PS_SUPPKEY  NUMBER(12)  NOT NULL,
PS_AVAILQTY NUMBER(12)  NOT NULL,
PS_SUPPLYCOST   NUMBER(12,2)    NOT NULL,
PS_COMMENT  VARCHAR(199)    NOT NULL,
    CONSTRAINT NEW_PARTSUPP_PKEY PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY),
    CONSTRAINT NEW_PARTSUPP_FKEY1 FOREIGN KEY (PS_PARTKEY)
        REFERENCES NEW_PART(P_PARTKEY),
    CONSTRAINT NEW_PARTSUPP_FKEY2 FOREIGN KEY (PS_SUPPKEY)
        REFERENCES NEW_SUPPLIER(S_SUPPKEY),
    CONSTRAINT NEW_PARTSUPP_CHECK1 CHECK(PS_PARTKEY >= 0),
    CONSTRAINT NEW_PARTSUPP_CHECK2 CHECK(PS_AVAILQTY >= 0),
    CONSTRAINT NEW_PARTSUPP_CHECK3 CHECK(PS_SUPPLYCOST >= 0) );

Сейчас, код вашей процедуры.

CREATE OR REPLACE PROCEDURE THELLO AS
    WELCOME VARCHAR(50);
BEGIN

  FOR PARTKEY IN (SELECT DISTINCT PS_PARTKEY FROM PARTSUPP)
  LOOP
    INSERT INTO NEW_PART ( SELECT * 
                           FROM PART
                           WHERE P_PARTKEY = PARTKEY.PS_PARTKEY );
    COMMIT;
  END LOOP;

  FOR SUPPKEY IN (SELECT DISTINCT PS_SUPPKEY FROM PARTSUPP)
  LOOP
    INSERT INTO NEW_SUPPLIER ( SELECT * 
                               FROM SUPPLIER
                               WHERE S_SUPPKEY = SUPPKEY.PS_SUPPKEY );
    COMMIT;
  END LOOP;

  INSERT INTO NEW_PARTSUPP ( SELECT * 
                             FROM PARTSUPP 
                 WHERE PS_PARTKEY IN ( SELECT P_PARTKEY
                                                   FROM NEW_PART ) AND
                                   PS_SUPPKEY IN ( SELECT S_SUPPKEY
                                                   FROM NEW_SUPPLIER ) );
  COMMIT;
END THELLO;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...