Ошибка компиляции оракула - PullRequest
0 голосов
/ 09 июня 2018

Хей.У меня есть задача, которая говорит, чтобы создать процедуру, которая добавляет столбец "BRUTTO" к таблице "TABELA_1", затем заполняет этот столбец значениями на основе значений из столбца "NETTO" и выводит все записи из TABLE_1, включая только что созданный BRUTTO.без закомментированного кода, но не иначе. Очевидно, он пока не видит столбец BRUTTO, поэтому я не могу ссылаться на него таким образом. Любая помощь приветствуется.

CREATE OR REPLACE PROCEDURE WSTAW_BRUTTO_I_WYSWIETL
AS
    --CURSOR C IS
        --SELECT NAZWISKO, NETTO, BRUTTO FROM TABELA_1;
    V_VAT NUMBER(9,2) := 24;
BEGIN
    EXECUTE IMMEDIATE 'ALTER TABLE TABELA_1 ADD BRUTTO NUMBER';
    EXECUTE IMMEDIATE 'UPDATE TABELA_1 SET BRUTTO = NETTO * (1 + :1 /100)' USING V_VAT;
    --FOR V_REC IN C 
    --LOOP
        --DBMS_OUTPUT.PUT_LINE('| '||V_REC.NETTO||' | '||V_REC.BRUTTO);
    --END LOOP;
END WSTAW_BRUTTO_I_WYSWIETL;

1 Ответ

0 голосов
/ 09 июня 2018

Ваша процедура не скомпилируется, потому что вы не можете получить доступ к столбцу до его добавления в таблицу.Не уверен, почему вы написали процедуру с динамическим 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

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