Как решить: - PLS-00103: Обнаружен символ "конец файла" при ожидании одного из следующих действий: начать процедуру прагмы функции завершения

Нужно изменить таблицу, добавив один столбец, как мы можем написать правильный синтаксис для изменения таблицы внутри пакета? может быть с процедурой или функцией?

Я попытался с процедурой и получил эту ошибку

CREATE OR REPLACE PACKAGE BODY temp IS

  PROCEDURE prc_proc_add_column(
                                 table_name  IN user_tab_columns.TABLE_NAME%TYPE,
                                 p_return    OUT NUMBER,
                                 p_message   OUT VARCHAR2
                               ) IS   
  BEGIN
      EXECUTE IMMEDIATE 'ALTER TABLE table_name ADD col_name NUMBER';
     p_return  := 0;
     p_message := 'Succesful';
    EXCEPTION WHEN OTHERS THEN p_return  := SQLCODE;
                               p_message := SQLERRM;        
  END prc_proc_add_column;

затем получить эту ошибку: -

PLS-00103: Encountered the symbol "end-of-file" when expecting one of      
the following: begin end function pragma procedure

Тело пакета заканчивается на END;?

Barbaros Özhan 13.04.2023 14:18

нет, это имя пакета другое, пока я просто делаю процедуру, и если она работает хорошо, я добавлю в пакет

Priyal Jain 13.04.2023 14:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Барбарос уже прокомментировал, что не так с опубликованным вами кодом, что касается синтаксиса.


Конечно, вы можете это сделать, но, вообще говоря, динамическое изменение модели данных — не лучшая идея.

Раз вы здесь, почему бы вам не изменить этот код, чтобы вы могли указать не только имя таблицы, но также имя столбца и его тип данных?

Обратите внимание, что при использовании динамического SQL в операторах DDL вы должны объединять имена в операторе; вы не можете использовать переменные связывания (не то, что вы делали ...), и - опять же, вообще говоря - не повредит, если вы позаботитесь о возможной инъекции SQL.

Вот пример.

Спецификация пакета:

SQL> CREATE OR REPLACE PACKAGE temp
  2  IS
  3     PROCEDURE prc_proc_add_column (
  4        p_table_name   IN     user_tab_columns.table_name%TYPE,
  5        p_column_name  IN     user_tab_columns.column_name%TYPE,
  6        p_datatype     IN     user_tab_columns.data_type%TYPE,
  7        p_return          OUT NUMBER,
  8        p_message         OUT VARCHAR2);
  9  END;
 10  /

Package created.

Тело пакета:

SQL> CREATE OR REPLACE PACKAGE BODY temp
  2  IS
  3     PROCEDURE prc_proc_add_column (
  4        p_table_name   IN     user_tab_columns.table_name%TYPE,
  5        p_column_name  IN     user_tab_columns.column_name%TYPE,
  6        p_datatype     IN     user_tab_columns.data_type%TYPE,
  7        p_return          OUT NUMBER,
  8        p_message         OUT VARCHAR2)
  9     IS
 10        l_str  VARCHAR2 (200);
 11     BEGIN
 12        l_str :=
 13              'ALTER TABLE '
 14           || DBMS_ASSERT.sql_object_name (p_table_name)
 15           || ' ADD '
 16           || DBMS_ASSERT.simple_sql_name (p_column_name)
 17           || ' '
 18           || DBMS_ASSERT.simple_sql_name (p_datatype);
 19
 20        EXECUTE IMMEDIATE l_str;
 21
 22        p_return := 0;
 23        p_message := 'Succesful';
 24     EXCEPTION
 25        WHEN OTHERS
 26        THEN
 27           p_return := SQLCODE;
 28           p_message := SQLERRM;
 29     END prc_proc_add_column;
 30  END;
 31  /

Package body created.

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

SQL> CREATE TABLE test
  2  (
  3     id   NUMBER
  4  );

Table created.

SQL> DECLARE
  2     l_ret  VARCHAR2 (200);
  3     l_msg  VARCHAR2 (200);
  4  BEGIN
  5     temp.prc_proc_add_column ('test',
  6                               'salary',
  7                               'number',
  8                               l_ret,
  9                               l_msg);
 10     DBMS_OUTPUT.put_line (l_ret || ': ' || l_msg);
 11  END;
 12  /

PL/SQL procedure successfully completed.

SQL> desc test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 SALARY                                             NUMBER

SQL>

Это сработало . Спасибо за это объяснение

Priyal Jain 13.04.2023 14:29

Другие вопросы по теме