Нужно изменить таблицу, добавив один столбец, как мы можем написать правильный синтаксис для изменения таблицы внутри пакета? может быть с процедурой или функцией?
Я попытался с процедурой и получил эту ошибку
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
нет, это имя пакета другое, пока я просто делаю процедуру, и если она работает хорошо, я добавлю в пакет
Барбарос уже прокомментировал, что не так с опубликованным вами кодом, что касается синтаксиса.
Конечно, вы можете это сделать, но, вообще говоря, динамическое изменение модели данных — не лучшая идея.
Раз вы здесь, почему бы вам не изменить этот код, чтобы вы могли указать не только имя таблицы, но также имя столбца и его тип данных?
Обратите внимание, что при использовании динамического 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>
Это сработало . Спасибо за это объяснение
Тело пакета заканчивается на
END;
?