Oracle SQL开发人员-错误:“未在预期位置找到FROM关键字”
很抱歉我的noob问题,但我正在试图找出为什么我的oraclesql会显示错误 未找到FROM关键字,如下图所示: 我尝试运行的代码如下所示:Oracle SQL开发人员-错误:“未在预期位置找到FROM关键字”,sql,oracle,Sql,Oracle,很抱歉我的noob问题,但我正在试图找出为什么我的oraclesql会显示错误 未找到FROM关键字,如下图所示: 我尝试运行的代码如下所示: select PCKCOO AS 'COMPANHIA_DO_PEDIDO_NUMERO_DO_PEDIDO', PCDOCO AS 'DOCUMENTO_NUMERO_DA_OS_FATURA', PCDCTO AS 'TIPO_DE_ORDEM', PCSFXO AS 'SUFIXO_DO_PEDIDO', rpad
select
PCKCOO AS 'COMPANHIA_DO_PEDIDO_NUMERO_DO_PEDIDO',
PCDOCO AS 'DOCUMENTO_NUMERO_DA_OS_FATURA',
PCDCTO AS 'TIPO_DE_ORDEM',
PCSFXO AS 'SUFIXO_DO_PEDIDO',
rpad(HORDT,'0',6) AS 'HORARIO_DE_LIBERACAO',
FX_PARA_GREGORIANA(HORDJ, 'DD/MM/YYYY')||' '||rpad(HORDT,6,'0') "APROVACAO",
rank() over (partition by pckcoo, pcdoco, pcdcto, pclnid order by FX_PARA_GREGORIANA(HORDJ, 'DD/MM/YYYY')||' '||rpad(HORDT,6,'0') desc) as rank,
FROM PRODDTA.F5543170 a,
proddta.f4209 b,
proddta.f4301 c,
WHERE
PCKCOO = '52171' AND
PCDCTO In ('OP','C1','C2','FZ','OF') AND
((PCTRDJ >= '117060' AND PCTRDJ <= '117090')
or (PCTRDJ >= '116061' AND PCTRDJ <= '116091')
) and
( b.hokcoo = a.pckcoo and
b.hodoco = a.pcdoco and
b.hodcto = a.pcdcto and
B.HOASTS = '2A') and
(c.phkcoo (+)= a.pckcoo and
c.phdoco (+)= COALESCE(TO_NUMBER(REGEXP_SUBSTR(PCOORN, '^(-|+)?d+(.|,)?(d+)?$')), 0) AND
c.phdcto (+)= 'OR')
代码要大得多,但我把它切成几段,以便找出为什么会发生这种情况,特别是关于
线路:3
和
栏目:25
正如错误消息所指出的,这对我来说毫无意义
此外,当我删除一些行以接近错误时,图中所示的红线保留在第一行
你能猜出为什么会这样吗?很抱歉再次提出这个基本问题。FROM子句的最后一个表proddta.f4301 c中有一个尾随逗号,应该变成
...
FROM PRODDTA.F5543170 a,
proddta.f4209 b,
proddta.f4301 c
...
应该将其删除
select语句中还有一个尾随逗号,也应该删除它
...
rank() over (partition by pckcoo, pcdoco, pcdcto, pclnid order by FX_PARA_GREGORIANA(HORDJ, 'DD/MM/YYYY')||' '||rpad(HORDT,6,'0') desc) as rank
...
最后,对于表别名,需要使用双引号而不是单引号:
select
PCKCOO AS "COMPANHIA_DO_PEDIDO_NUMERO_DO_PEDIDO",
PCDOCO AS "DOCUMENTO_NUMERO_DA_OS_FATURA",
PCDCTO AS "TIPO_DE_ORDEM",
PCSFXO AS "SUFIXO_DO_PEDIDO",
rpad(HORDT,'0',6) AS "HORARIO_DE_LIBERACAO",
...
在AS RANK和proddta.f4301 c之后有一些尾随逗号 此外,不能对列别名使用单引号,但需要双引号; 这应该起作用:
SELECT PCKCOO AS "COMPANHIA_DO_PEDIDO_NUMERO_DO_PEDIDO",
PCDOCO AS "DOCUMENTO_NUMERO_DA_OS_FATURA",
PCDCTO AS "TIPO_DE_ORDEM",
PCSFXO AS "SUFIXO_DO_PEDIDO",
RPAD(
HORDT,
'0',
6
)
AS "HORARIO_DE_LIBERACAO",
FX_PARA_GREGORIANA(HORDJ, 'DD/MM/YYYY')
|| ' '
|| RPAD(
HORDT,
6,
'0'
)
"APROVACAO",
RANK()
OVER(
PARTITION BY pckcoo,
pcdoco,
pcdcto,
pclnid
ORDER BY
FX_PARA_GREGORIANA(HORDJ, 'DD/MM/YYYY')
|| ' '
|| RPAD(
HORDT,
6,
'0'
) DESC
)
AS RANK
FROM PRODDTA.F5543170 a,
proddta.f4209 b,
proddta.f4301 c
WHERE PCKCOO = '52171'
AND PCDCTO IN ('OP',
'C1',
'C2',
'FZ',
'OF')
AND ( ( PCTRDJ >= '117060'
AND PCTRDJ <= '117090')
OR ( PCTRDJ >= '116061'
AND PCTRDJ <= '116091'))
AND ( b.hokcoo = a.pckcoo
AND b.hodoco = a.pcdoco
AND b.hodcto = a.pcdcto
AND B.HOASTS = '2A')
AND ( c.phkcoo(+) = a.pckcoo
AND c.phdoco(+) = COALESCE(TO_NUMBER(REGEXP_SUBSTR(PCOORN, '^(-|+)?d+(.|,)?(d+)?$')), 0)
AND c.phdcto(+) = 'OR')
另一方面,您最好切换到ANSI JOIN语法。您的最后一个select列rankYou后面有一个逗号,您的最后一个表proddta后面也有一个逗号。f4301 c,您似乎还混合了别名的单引号和双引号,这可能是错的,也可能不是错的我对Oracle不够熟悉,无法判断,这至少是不一致的。还建议使用“现代”联接语法,而不是逗号分隔的表列表。使用每个属性的表别名来限定每个属性也是一种很好的做法,因此更明显的是,例如PCKCOO来自何处。提醒以后:此错误通常是由于SELECT子句“SUFIXO_DO_PEDIDO”中的逗号问题导致的,因为“SUFIXO_DO_PEDIDO”是无效的SQL。单引号用于字符串值,而不是标识符