Ваша процедура не скомпилируется, потому что вы не можете получить доступ к столбцу до его добавления в таблицу.Не уверен, почему вы написали процедуру с динамическим SQL для этого.Простой SQL-оператор должен работать.Кроме того, вы не можете использовать переменную связывания в DDL, это вызвало бы
ORA-01027: переменные связывания не разрешены для операций определения данных
во время выполнения.
Вам также следует рассмотреть возможность использования BRUTTO
в качестве ВИРТУАЛЬНОЙ КОЛОННЫ , а не самого столбца.
ALTER TABLE TABELA_1 ADD BRUTTO NUMBER AS ( NETTO * (1 + 24 /100) );
Демонстрация
Если вы все еще думаете, что хотите процедуру и она должна быть скомпилирована, вам следует поместить блок внутрь EXECUTE IMMEDIATE
, но это не рекомендуется.
CREATE OR REPLACE PROCEDURE wstaw_brutto_i_wyswietl AS
v_vat NUMBER(9,2) := 24;
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE TABELA_1 ADD BRUTTO NUMBER AS ( NETTO * (1 + '
|| v_vat
|| ' /100) )';
EXECUTE IMMEDIATE q'{BEGIN
FOR V_REC IN ( SELECT NETTO,BRUTTO FROM TABELA_1 )
LOOP
DBMS_OUTPUT.PUT_LINE(V_REC.NETTO||','||V_REC.BRUTTO);
END LOOP;
END;}'
;
END wstaw_brutto_i_wyswietl;
/
Demo2