我正在为大学练习编写一小段代码,但我无法让它发挥作用。只有当Anagrafica的行没有空字段时,我才想加入Cod上的Impiegato和Anagrafica行。然后,对于新临时表的每一行,我生成一个字符串(some_string),该字符串将是ReportImpiegato表中Report字段的值。我使用的是Oracle 11g和SQL Developer。提前感谢愿意提供帮助的每个人。 : - )
我的表是:
TABLE IMPIEGATO
COD NUMBER(4,0)
NOME VARCHAR2(40 BYTE)
COGNOME VARCHAR2(40 BYTE)
DATA_ASSUNTO DATE
STIPENDIO NUMBER(8,2)
CAPO NUMBER(4,0)
TABLE ANAGRAFICA
COD NUMBER(4,0)
DATAN DATE
SESSO CHAR(1 BYTE)
LUOGON VARCHAR2(80 BYTE)
PROVN CHAR(2 BYTE)
TABLE REPORTIMPIEGATO
COD NUMBER
REPORT VARCHAR2(4000 BYTE)
我的代码是:
MERGE INTO ReportImpiegato R
USING (SELECT * FROM (
(SELECT *
FROM Anagrafica A
WHERE (A.DATAN IS NOT NULL AND A.LUOGON IS NOT NULL AND A.PROVN IS NOT NULL AND A.SESSO IS NOT NULL)) A
JOIN
(Impiegato I)
ON (A.Cod = I.Cod)
)) D
ON (R.Cod = D.Cod)
WHEN MATCHED THEN
UPDATE SET R.Report = some_string
WHEN NOT MATCHED
INSERT (Cod, Report) VALUES (D.Cod, some_string)
输出是:
Error starting at line : 1 in command -
MERGE INTO ReportImpiegato R
USING (SELECT * FROM (
(SELECT * FROM Anagrafica A WHERE (A.DATAN IS NOT NULL AND A.LUOGON IS NOT NULL AND A.PROVN IS NOT NULL AND A.SESSO IS NOT NULL)) A
JOIN
(Impiegato I)
ON (A.Cod = I.Cod)
)) D
ON (R.Cod = D.Cod)
WHEN MATCHED THEN
UPDATE SET R.Report = some_string
WHEN NOT MATCHED
INSERT (Cod, Report) VALUES (D.Cod, some_string);
Error at Command Line : 14 Column : 5
Error report -
SQL Error: ORA-00905: missing keyword
00905. 00000 - "missing keyword"
*Cause:
*Action:
答案 0 :(得分:1)
错误消息指向出现问题的行和字符。如果我运行的代码是在实际报告的问题中发布的(12,5),那就是INSERT
。
您在错误的分支上错过了THEN
:
...
WHEN NOT MATCHED THEN --- THEN was missing!
INSERT (Cod, Report) VALUES (D.Cod, some_string)
后续ORA-00904: "D"."COD": invalid identifier
是因为您在select *
子句中执行了using
。如果你在它上面运行那个子查询,你最终会得到名为COD
和COD_1
的列,至少在SQL Developer中,除了来自两个连接表的所有其他列名之外;但它取决于客户。在合并中,似乎做了不同的事情。如果你这样做
MERGE INTO ReportImpiegato R
USING (SELECT A.COD FROM (
即。只选择你真正需要的列,这个问题就会消失。
(我不知道some_string
应该来自哪里;它可能是您真实代码中的字面值。)