尝试运行简单脚本时SQL无效标识符

时间:2014-06-16 15:29:05

标签: sql oracle plsql

我正在尝试运行以下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部分有关。在初步谷歌搜索之后我无法确定这个语句是异步的还是类似的,所以理论上应该没有错误抛出。

2 个答案:

答案 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'它会执行。