编译错误oracle过程

编译错误oracle过程,oracle,stored-procedures,Oracle,Stored Procedures,嘿。我的任务是创建一个过程,将列“BRUTTO”添加到表“TABELA_1”中,然后根据列“NETTO”中的值填充该列并输出表_1中的所有记录,包括新创建的bruto。它在没有注释掉代码的情况下工作,但在其他情况下不工作。显然它还没有看到布鲁托列,所以我不能这样引用它。谢谢你的帮助 CREATE OR REPLACE PROCEDURE WSTAW_BRUTTO_I_WYSWIETL AS --CURSOR C IS --SELECT NAZWISKO, NETTO, B

嘿。我的任务是创建一个过程,将列“BRUTTO”添加到表“TABELA_1”中,然后根据列“NETTO”中的值填充该列并输出表_1中的所有记录,包括新创建的bruto。它在没有注释掉代码的情况下工作,但在其他情况下不工作。显然它还没有看到布鲁托列,所以我不能这样引用它。谢谢你的帮助

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;

您的过程将无法编译,因为在将列添加到表之前无法访问该列。不知道为什么要为此编写一个使用动态SQL的过程。简单的SQL语句应该可以工作。此外,不能在DDL中使用bind变量,它会引发

ORA-01027:数据定义操作不允许绑定变量

在运行时

你也应该考虑使用<代码> Brutto作为A,而不是一个列本身。

ALTER TABLE TABELA_1 ADD BRUTTO NUMBER AS ( NETTO * (1 + 24 /100) );

如果您仍然认为需要一个过程,并且它必须编译,那么应该将该块放在
executeimmediate
中,但不建议这样做

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;
/

您的过程将无法编译,因为在将列添加到表中之前,您无法访问该列。不知道为什么要为此编写一个使用动态SQL的过程。简单的SQL语句应该可以工作。此外,不能在DDL中使用bind变量,它会引发

ORA-01027:数据定义操作不允许绑定变量

在运行时

你也应该考虑使用<代码> Brutto作为A,而不是一个列本身。

ALTER TABLE TABELA_1 ADD BRUTTO NUMBER AS ( NETTO * (1 + 24 /100) );

如果您仍然认为需要一个过程,并且它必须编译,那么应该将该块放在
executeimmediate
中,但不建议这样做

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;
/

请检查我的答案,如果它对您有帮助,请接受它,或者为给定的解决方案提供相关反馈(评论)。请阅读:了解它的重要性。请检查我的答案,如果它对您有帮助,请接受它,或者为给定的解决方案提供相关反馈(评论)。请阅读:了解为什么它很重要。