编译错误oracle程序

时间:2018-06-09 12:15:30

标签: oracle stored-procedures

HeJ小鼠。我有一个任务,创建一个过程,将列“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 :(得分:2)

您的过程将无法编译,因为在将列添加到表之前无法访问该列。不确定为什么要为此编写带有动态SQL的过程。一个普通的SQL语句应该可行。而且,你不能在DDL中使用绑定变量,它会引发

  

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

在运行时间。

您还应该考虑将BRUTTO用作VIRTUAL COLUMN,而不是列本身。

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

Demo

如果你仍然认为你想要一个程序并且必须编译,你应该将该块放在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