вставка оператора внутри хранимой процедуры не удалась - PullRequest
0 голосов
/ 03 июля 2018

Я написал хранимую процедуру оракула и создал таблицу журнала ошибок, если она не существует.

SELECT COUNT(*)  
       INTO v_count  
       FROM all_tables  
       WHERE TABLE_NAME = 'ERROR_LOG';  
       IF v_count       =0 THEN  
     cr_table := 'CREATE TABLE ERROR_LOG ( ERROR_LOG_ID  NUMBER GENERATED BY DEFAULT ON         NULL AS IDENTITY, IDENTIFIER VARCHAR2(100), ERROR_MESSAGE VARCHAR2(1000),created_by varchar2(100        ), created_date TIMESTAMP DEFAULT systimestamp )';  
execute immediate cr_table;

затем введите оператор вставки ниже в коде как

INSERT
INTO error_log
(
identifier,
error_message,
created_by
)
VALUES
(
v_identifier,
'Success',
v_user
);

Но SP выдает ошибку компиляции с

PL / SQL: ORA-00942: таблица или представление не существует

Если я создаю таблицу вручную, в автономном режиме и компилирую, она работает. любая помощь?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Это слишком долго для комментария.

Таблица не существует, когда код скомпилирован. Следовательно, вы получаете ошибку во время компиляции. Во время компиляции Oracle не знает, что таблица будет существовать при выполнении.

Одним из решений является использование динамического SQL для insert.

Лучшее решение - настроить базу данных с соответствующими таблицами до того, как код сможет быть выполнен. Динамическое создание постоянных таблиц в условном коде обычно является признаком плохо разработанного приложения.

0 голосов
/ 03 июля 2018

Перед использованием хранимой процедуры, пожалуйста, создайте представление или таблицу, в которую вы собираетесь вставить значения, используя SP. Так что это позволит избежать ошибки компиляции во время выполнения.

0 голосов
/ 03 июля 2018

если вы используете execute immediate для создания таблицы, она существует в контексте PL / SQL, а не в контексте SQL , вы должны выполнить INSERT, используя также команду execute immedation. Или вы должны сделать вставку внутри другого блока BEGIN .. END.

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