ORA-01747:user.table.column,table.column或列规范无效

时间:2012-02-27 02:02:33

标签: oracle plsql dynamic-sql

在循环中调用execute immediate时获取上述错误

Update CustomersPriceGroups set  1AO00=:disc  Where cuno=:cuno
    Parameters:   disc=66 cuno=000974
Update CustomersPriceGroups set  1AP00=:disc  Where cuno=:cuno
    Parameters:   disc=70.5 cuno=000974
Update CustomersPriceGroups set  1AQ00=:disc  Where cuno=:cuno
    Parameters:   disc=66 cuno=000974
Update CustomersPriceGroups set  1ZA00=:disc  Where cuno=:cuno
    Parameters:   disc=60 cuno=000974

这是什么意思?

这是代码片段

    c:=PriceWorx.frcPriceListCustomers('020','221');
LOOP
  fetch c into comno,cuno,nama,cpls;
  exit when c%notfound;
  dbms_output.put_Line(cuno);
   g:=priceWorx.frcPriceListItemGroups('020','221');
   d:=priceworx.frcCustomerDiscounts('020','221',cuno);
  loop
    fetch g into comno,cpgs,n;
    fetch d into comno,cpls,cuno,cpgs,stdt,tdat,qanp,disc,src;
    --dbms_output.put(chr(9)||cpgs);
    sQ:='Update saap.CustomersPriceGroups set "'|| trim(cpgs)||'"=:disc '
       || ' Where cuno=:cuno';
    execute immediate sQ using disc,cuno; 
    commit;
    dbms_output.put_line( sQ );
    dbms_output.put_line( chr(9)||'Parameters:   disc='|| disc||' cuno='||cuno);
    exit when g%notfound;
  end loop;
  close g;
  close d;
end loop;

11 个答案:

答案 0 :(得分:24)

检查您的查询是否有双逗号。

insert into TABLE_NAME (COLUMN1, COLUMN2,,COLUMN3) values(1,2,3);

(COLUMN2之后还有额外的逗号)。


更新:最近(有些人有特殊才能)我成功地通过新方法得到同样的例外:

update TABLE_NAME set COLUMN1=7, set COLUMN2=8

(第二个SET是多余的)

答案 1 :(得分:6)

这意味着Oracle解析器认为您的某个列无效。这可能是因为您错误地引用了列,列名称是保留字,或者因为UPDATE语句中的语法错误导致Oracle认为不是列的内容是列。真正有助于查看正在执行的完整语句,CustomersPriceGroups表的定义以及引发异常的全文,因为它通常会告诉哪个列位于故障。

答案 2 :(得分:6)

不带引号的标识符必须以字母字符开头(请参阅rule 6 here)。您正在尝试为名称以1AO001AP00等名称开头的列分配值。

如果没有看到CustomersPriceGroups的表定义,我们就不知道它是否包含具有这些名称的列。如果是,则必须将它们创建为带引号的标识符。如果是这样你将不得不用引号引用它们(无处不在),这是不理想的 - 使代码更难阅读,这样就容易犯这样的错误,并且很难发现错误。甚至甲骨文也在同一页上说:

  

注意:Oracle不建议对数据库使用带引号的标识符   对象名称。 SQL * Plus接受这些带引号的标识符,但是   使用其他管理数据库的工具时,它们可能无效   对象。

在您的代码中,当您指定sQ时,您似乎正在使用引号,但您显示的输出却没有;但它也没有saap.模式标识符。这可能是因为你没有运行你认为的代码版本,但可能就是这样 如果您重新输入数据而不是粘贴数据,则会丢失 - 您也没有显示c.cuno的早期输出。但是,你也可能比如说列名错误。

如果execute抛出了错误,你就不会看到循环周围执行的命令,因为调试发生在它之后 - 你看到的是成功的值,而不是正在破坏的值。您需要检查函数返回的所有值;我怀疑g返回的cpgs值实际上不是有效的列名。

正如@ninesided所说,显示更多信息,特别是完整的异常消息,将有助于识别出错误。

答案 3 :(得分:1)

除了此处其他答案中引用的原因之外,您可能还需要检查没有任何表列名称具有在oracle数据库中被视为特殊/保留字的名称。

在我的情况下,我有一个表列名称uid。 uid是oracle中的保留字,因此我收到了这个错误。

幸运的是,我的桌子是一张新桌子,我没有数据。我能够使用oracle DROP表命令删除表并创建一个新的问题列的修改名称。

我也无法重命名问题列,因为oracle不会让我继续抛出错误。

答案 4 :(得分:1)

如果你在set语句的末尾添加一个额外的“,”而不是语法错误,你将获得ORA-01747,这在Oracle中非常奇怪 例如

.xib

答案 5 :(得分:1)

我正在编写查询。我必须删除[]

UPDATE SN.TableName 
SET [EXPIRY_DATE] = systimestamp + INTERVAL '12' HOUR, 
WHERE [USER_ID] ='12345'

我们最近从SQL Server迁移到了Oracle。

答案 6 :(得分:0)

原因也可能是您按一组不同的列进行分组,例如:

select tab.a, tab.b, count(*)
from ...
where...
group by tab.a, tab.c;

答案 7 :(得分:0)

您在SQL语句中使用了oracle关键字

答案 8 :(得分:0)

  

ORA-01747:无效的user.table.column,table.column或列   规格

当您比较两个列的ID时,如果您错过了列的关系,您将得到的是,检查数据库中的两个ID将会是不同的 这是我面临的示例示例:

UPDATE TABLE_NAME SET APPROVED_BY='1000',CHECK_CONDITION=ID, WHERE CONSUMER_ID='200'

这里的问题,当“ CHECK_CONDITION”和“ ID”两个列的ID都不相同时 如果这两个ID这次都相同,则您的查询将正常执行,请检查您在代码中比较的ID Id两个列。

答案 9 :(得分:0)

对我来说,该问题是由于使用列名“ CLUSTER”(在Oracle中是保留字)引起的。我试图插入列中。重命名该列解决了我的问题。

insert into table (JOB_NAME, VERSION, CLUSTER, REPO, CREATE_TS) VALUES ('abc', 169, 'abc.war', '1.3', 'test.com', 'test', '26-Aug-19 04.27.09.000000949 PM')
Error at Command Line : 1 Column : 83
Error report -
SQL Error: ORA-01747: invalid user.table.column, table.column, or column specification

答案 10 :(得分:0)

就我而言,我有一些*。像count(dr。*)