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;
答案 0 :(得分:2)
您的过程将无法编译,因为在将列添加到表之前无法访问该列。不确定为什么要为此编写带有动态SQL的过程。一个普通的SQL语句应该可行。而且,你不能在DDL中使用绑定变量,它会引发
ORA-01027:绑定变量不允许进行数据定义操作
在运行时间。
您还应该考虑将BRUTTO
用作VIRTUAL COLUMN,而不是列本身。
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;
/