В Oracle вы действительно редко используете динамический SQL для создания объектов базы данных.Люди иногда злоупотребляют той функциональностью, которая, по моему мнению, является тем, что вы пытаетесь сделать.Тот факт, что вы можете сделать это, не означает, что вы должны сделать это, например, вы можете ткнуть глаз карандашом, но вы не должны этого делать.
Практическое правило с динамическим SQL:
- забудьте о
EXECUTE IMMEDIATE
- Создайте локальную переменную (большую
VARCHAR2
или CLOB
, в зависимости от того, что вы - составляет оператор (
CREATE TRIGGER
в вашем случае) и - сохраняет его в этой переменной
- отображает его на экране, используя
DBMS_OUTPUT.PUT_LINE
- скопируйте / вставьте его и запустите как отдельный оператор
- , если это удастся, вы проделали хорошую работу, поэтому теперь вы можете использовать его в
EXECUTE IMMEDIATE
- , если не получитсявам нужно будет немного сложнее, отладить его, исправить ошибки и повторить цикл
По состоянию на полученную ошибку: this:
for row in (SELECT column_name from user_tab_columns where table_name=''EMPLOYEES'' loop
execute immediate '':old.row.column_name '';
end loop;
недопустимо в качестве цели INSERT INTO
;Вы не можете смешивать SQL и PL / SQL таким образом.Он не будет работать вообще, независимо от того, какой динамический SQL вы используете.Кроме того, очевидно, что это неправильно (отсутствует закрывающая скобка, что именно вы выполняете немедленно ? old_row.column_name
? Как бы вы выполнили имя столбца?
По моему мнению (еще раз), вы не должны делать это таким образом. Если вы хотите создать триггер, сделайте это - но не динамически .