我正在尝试运行以下Oracle SQL脚本,该脚本应创建一个新列TEMPLATE
,并使用一些基本值填充它,但我收到错误。
DECLARE v_cnt INT;
BEGIN
select count(*) into v_cnt
from user_tab_columns
where upper(table_name) = upper('myTable') and upper(column_name) = upper('template');
IF(v_cnt = 0) THEN
EXECUTE IMMEDIATE 'ALTER TABLE MYTABLE ADD TEMPLATE NVARCHAR2(255)';
UPDATE MYTABLE
SET TEMPLATE = 'BASE VALUE';
END IF;
END; /
我得到的错误是
ORA-06550:第10行,第37栏:
PL/SQL: ORA-00904: "TEMPLATE": invalid identifier
当尝试手动运行这些语句时,一切似乎都正常。我认为这个问题与我不熟悉的EXECUTE IMMEDIATE
部分有关。在初步谷歌搜索之后我无法确定这个语句是异步的还是类似的,所以理论上应该没有错误抛出。
答案 0 :(得分:2)
我在发布问题后不久就找到了解决方案。这实际上是一个编译问题。 Oracle编译器在执行之前读取整个脚本并引发异常,因为我试图显式更新在脚本运行之前不存在的列。
解决方案是将UPDATE
语句放在EXECUTE IMMEDIATE
块中。
....
EXECUTE IMMEDIATE 'UPDATE EGPL_USER_ROLE SET TEMPLATE = ''BASE VALUE''';
....
答案 1 :(得分:0)
您尝试添加的列名TEMPLATE是一个保留字。请参阅ORA-00904并查看保留字列表(http://docs.oracle.com/cd/E10530_01/doc/epm.931/html_esb_techref/maxl/ddl/keywords.htm)。
将名称更改为' A_TEMPLATE'它会执行。