【问题标题】:ORA-01747: invalid user.table.column, table.column, or column specificationORA-01747: 无效的 user.table.column、table.column 或列规范
【发布时间】:2012-03-16 13:59:08
【问题描述】:

循环调用立即执行时出现上述错误

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;

【问题讨论】:

    标签: oracle plsql dynamic-sql


    【解决方案1】:

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

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

    (COLUMN2 后面多了一个逗号)。


    更新:最近(有些人有特殊才能)我成功地用新方法得到了同样的异常:

    update TABLE_NAME set COLUMN1=7, set COLUMN2=8
    

    (第二个 SET 是多余的)

    【讨论】:

    • 请用至少两行或更多行来解释您的答案。为了更好地理解。
    • 谢谢。我在第一个右大括号之前加了一个逗号)。 Oracle 似乎不会费心给出好的错误消息。
    • 谢谢,@yurin。你刚刚拯救了我的一天。 +1。
    【解决方案2】:

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

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

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

    在您的代码中,当您分配sQ 时,您似乎使用了引号,但您显示的输出却没有;但它也没有 saap. 架构标识符。这可能是因为您没有运行您认为的代码版本,但可能只是 如果您重新输入数据而不是粘贴数据,则会丢失 - 您也没有显示 c.cuno 的早期输出。但也有可能是列名的大小写错误。

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

    正如@nineside 所说,显示更多信息,尤其是完整的异常消息,将有助于找出问题所在。

    【讨论】:

      【解决方案3】:

      这意味着 Oracle 解析器认为您的列之一无效。这可能是因为您错误地引用了列,列名是保留字,或者因为您在 UPDATE 语句中存在语法错误,导致 Oracle 认为不是列的东西是列。查看正在执行的完整语句、CustomersPriceGroups 表的定义和引发的异常的全文会很有帮助,因为它通常会告诉 哪个 列有问题。

      【讨论】:

      • 在我的例子中,,insert 语句中的结尾有一个逗号。
      • 在我的例子中,列名是保留字。
      • 很好,所有这些完全不同的问题如何产生相同的错误消息。并不是解析器不知道出了什么问题(在哪个 if-check-branch 处),工程师只是懒得给出更具体的错误消息。
      • 在我的例子中,列名也是一个保留字。解决方法如下:stackoverflow.com/questions/11629966/…
      【解决方案4】:

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

        update table1 
        set col1 = 'Y', --this odd 1
        where col2 = 123
        and col3 = 456 
      

      【讨论】:

      • 我也有同样的问题。如果您引用集合的额外逗号结尾。它将在 Oracle 中有 ORA-01747。
      【解决方案5】:

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

      在我的例子中,我有一个表列名 uid。 uid 是 oracle 中的保留字,因此出现此错误。

      幸运的是,我的表是一个新表,其中没有数据。我能够使用 oracle DROP table 命令删除该表并为问题列创建一个具有修改名称的新表。

      我在重命名问题列时也遇到了麻烦,因为 oracle 不允许我并不断抛出错误。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我正在写查询。我不得不删除 []

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

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

          【讨论】:

          • 我为你感到难过。真诚的。
          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            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 both 您在代码中比较的列。

            【讨论】:

              【解决方案10】:

              对我来说,问题是由于使用了列名“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
              

              【讨论】:

                【解决方案11】:

                就我而言,我有一些。* 数。比如count(dr.*)

                【讨论】:

                  猜你喜欢
                  • 2018-12-19
                  • 2013-04-28
                  • 2015-05-01
                  • 2013-10-21
                  • 2016-10-25
                  • 1970-01-01
                  • 2021-03-05
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多