在循环中调用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;
答案 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)。您正在尝试为名称以1AO00
,1AP00
等名称开头的列分配值。
如果没有看到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。*)