PLS-00103 встретил символы "/" и "Создать" - PullRequest
0 голосов
/ 25 сентября 2018

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

У меня были проблемы в первый раз с PLS-00103 Слово «СОЗДАТЬ», и когда я поставил «/» в третьей строке, у меня возникла проблема с PLS-00103 «/».Что я делаю не так?

create or replace package Sappe as
       Procedure initialize;
end;
/

create or replace package body Sappe as

  Procedure initialize is
  begin
    Drop table AAA;

    CREATE TABLE AAA(id int not null,
                     x1 varchar(1) default ' ',
                     x2 varchar(1) default ' ',
                     x3 varchar(1) default ' ',
                     x4 varchar(1) default ' ',
                     x5 varchar(1) default ' ',
                     x6 varchar(1) default ' ',
                     x7 varchar(1) default ' ');

  end initialize;
end sappe;
/

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Это слишком много кода, чтобы поместить его в комментарий, поэтому я пишу его здесь.

Сначала проверим, существует ли таблица:

SQL> DESC aaa;
ERROR:
ORA-04043: object aaa does not exist

Теперь создаемПакет и его тело - я включил элемент управления, который предотвратит ошибку, если таблица не существует:

SQL> CREATE OR REPLACE PACKAGE Sappe
  2  AS
  3     PROCEDURE initialize;
  4  END;
  5  /

Package created.

SQL> CREATE OR REPLACE PACKAGE BODY Sappe
  2  AS
  3     PROCEDURE initialize
  4     IS
  5        l_cnt   NUMBER;
  6     BEGIN
  7        SELECT COUNT (*)
  8          INTO l_cnt
  9          FROM user_tables
 10         WHERE table_name = 'AAA';
 11
 12        IF l_cnt > 0
 13        THEN
 14           EXECUTE IMMEDIATE 'Drop table AAA';
 15        END IF;
 16
 17        EXECUTE IMMEDIATE q'[CREATE TABLE AAA(id int not null,
 18                       x1 varchar(1) default ' ',
 19                       x2 varchar(1) default ' ',
 20                       x3 varchar(1) default ' ',
 21                       x4 varchar(1) default ' ',
 22                       x5 varchar(1) default ' ',
 23                       x6 varchar(1) default ' ',
 24                       x7 varchar(1) default ' ')]';
 25     END initialize;
 26  END sappe;
 27  /

Package body created.

Тестирование:

SQL> BEGIN
  2     sappe.initialize;
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>
SQL> DESC aaa;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(38)
 X1                                                 VARCHAR2(1)
 X2                                                 VARCHAR2(1)
 X3                                                 VARCHAR2(1)
 X4                                                 VARCHAR2(1)
 X5                                                 VARCHAR2(1)
 X6                                                 VARCHAR2(1)
 X7                                                 VARCHAR2(1)

SQL>

Как видите, это работает.Таблица теперь существует, поэтому - давайте запустим процедуру еще раз - не должно произойти сбой:

SQL> BEGIN
  2     sappe.initialize;
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>

Кажется, все в порядке.

0 голосов
/ 25 сентября 2018

Мы не можем сделать нативный DDL в PL / SQL.Вам придется использовать динамический SQL:

create or replace package body Sappe as

  Procedure initialize is
  begin
    execute immediate 'Drop table AAA';

    execute immediate 
          q'[CREATE TABLE AAA(id int not null,
                     x1 varchar(1) default ' ',
                     x2 varchar(1) default ' ',
                     x3 varchar(1) default ' ',
                     x4 varchar(1) default ' ',
                     x5 varchar(1) default ' ',
                     x6 varchar(1) default ' ',
                     x7 varchar(1) default ' ')]';

     end initialize;
end sappe;
/

На первом шаге ваша процедура завершится ошибкой, если у вас еще нет таблицы AAA.Существуют различные способы решения этой проблемы (например, проверка USER_TABLES), но основная предпосылка хранимых процедур, подобных этой, в основном ошибочна.За исключением нескольких узкоспециализированных сценариев использования, нет необходимости удалять и создавать таблицы в PL / SQL.Это распространенный анти-паттерн среди людей, которые больше знакомы с другими продуктами СУБД, чем с Oracle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...