【发布时间】:2018-06-15 15:04:52
【问题描述】:
我有一个用 PHP 构建的内部 Intranet,我们在这里有 Oracle 服务器,但它已移至云服务器。既然这样我就有问题了。
如果我从 PHP 执行一个简单的查询,如“select * from empresas”,它会正常执行,但如果我尝试一个更复杂的查询,带有一些连接和 where 子句,它会给出错误 ORA-03113。尝试从 PL/SQL Developer 执行,这个特定的查询需要大约 5 秒来执行,它只返回大约 15 行。
我无法访问 Oracle 日志,因为这个云对我们来说只是一个实例。
我认为可能是 PDO 配置或版本,我需要配置/检查以解决此问题,只是不知道如何开始。
旧的 Oracle 服务器是 Windows 服务器,Oracle 版本是 12。云是 Oracle 11,是 Linux 服务器。
这里是查询:
`SELECT distinct
ct.descricao MARCA,
e.nome EMPRESA,
vi.cod_item CODIGO,
i.descricao DESCRICAO,
igi.cod_grupo_interno CODTIPO,
igi.descricao TIPO,
ic.cod_curva CLASSEABC,
v.cod_cliente COD_CLIENTE,
cd.nome NOME_CLIENTE,
ci.descricao CID_CLIENTE,
ci.uf UF_CLIENTE,
CASE WHEN cd.cpf<>' ' THEN 'F' ELSE 'J' END TIPO_CLIENTE,
cl.descricao DESCTP_CLIENTE,
SUM(vi.qtde) QTDE,
vi.preco_unitario PPUBLICO,
SUM(vi.qtde * vi.preco_unitario) FAT_BRT,
SUM(vi.TOTAL_DESCONTOS) DESCONTO,
SUM(vi.preco_liquido_final) FAT_LIQ,
SUM(vi.qtde * vi.preco_contabil) CUSTO,
SUM(vi.base_icms) BASE_ICMS,
SUM(vi.valor_icms) VLR_ICMS,
'0' VLR_COP,
'0' ACRESCIMO,
SUM(vi.valor_pis + vi.valor_cofins) VLR_PCOF,
SUM(vi.valor_ipi) VLR_IPI,
NULL VLR_MARGEM,
v.controle|| '-' || v.serie NF,
TO_CHAR(v.emissao, 'DD/MM/YYYY') DTNF,
n.cod_natureza CODNATUREZA,
n.descricao NATUREZA,
eu.id_funcionario VENDEDOR,
eu.nome_completo FUNCIONARIO,
eu.nome LOGIN,
eu.cod_funcao TIPO_FUN,
'N' STATUS,
v.numero_os OS,
v.chassi_resumido VEICULO,
cd.bairro BAIRRO_CLIENTE,
v.controle|| '-' || v.serie NOTA,
pg.descricao CONDICAO_PG,
pg.cod_forma_pgto COD_CONDICAO,
os.tipo CD_TP_OS,
ost.descricao DS_TP_OS,
'0' PERCUSTOOPER,
ed.cod_empresa_departamento DEPARTAMENTO,
ic.custo_fornecedor VLRREPOSICAO
FROM vendas v
INNER JOIN venda_itens vi ON vi.cod_empresa = v.cod_empresa and vi.controle = v.controle
INNER JOIN itens_custos ic ON ic.cod_empresa = v.cod_empresa AND ic.cod_item = vi.cod_item AND ic.cod_fornecedor = vi.cod_fornecedor
INNER JOIN itens_fornecedor if ON if.cod_item = vi.cod_item AND if.cod_fornecedor = vi.cod_fornecedor
INNER JOIN fornecedor_estoque fe ON fe.cod_fornecedor = if.cod_fornecedor
INNER JOIN itens i ON i.cod_item = vi.cod_item
INNER JOIN itens_grupo_interno igi ON igi.cod_grupo_interno = i.cod_grupo_interno
INNER JOIN empresas e ON e.cod_empresa = v.cod_empresa
INNER JOIN empresas_usuarios eu ON eu.nome = v.vendedor
INNER JOIN empresas_funcoes ef ON ef.cod_funcao = eu.cod_funcao
INNER JOIN empresas_departamentos ed ON ed.cod_empresa = v.cod_empresa AND ed.cod_empresa_departamento = v.cod_empresa_departamento
INNER JOIN parm_sys p ON p.cod_empresa = v.cod_empresa
INNER JOIN concessionaria_tipo ct ON ct.cod_tipo_concessionaria = p.tipo_concessionaria
INNER JOIN cliente_diverso cd ON cd.cod_cliente = v.cod_cliente AND cd.cod_empresa = v.cod_empresa
INNER JOIN clientes_tipo cl ON cl.cod_tipo = cd.cod_tipo
INNER JOIN cidades ci ON ci.cod_cidades = cd.cod_cidades
LEFT JOIN pagamento_venda pv ON pv.controle = v.controle AND pv.serie = v.serie
LEFT JOIN forma_pgto pg ON pg.cod_forma_pgto = pv.cod_forma_pgto
LEFT JOIN os ON os.cod_empresa = v.cod_empresa and os.numero_os = v.numero_os
LEFT JOIN os_tipos ost ON ost.tipo = os.tipo
LEFT JOIN natureza n ON n.cod_natureza = vi.cod_natureza and n.grupo = vi.grupo
LEFT JOIN operacoes ops ON ops.cod_empresa = v.cod_empresa and ops.cod_operacao = v.cod_operacao
WHERE v.status <> '1' AND v.total_produtos > 0
AND (ops.grupo is null or ops.grupo = 2)
AND v.emissao >= to_date(SYSDATE-20)
AND i.COD_GRUPO_INTERNO <> 13
GROUP BY ct.descricao, e.nome, vi.cod_item, i.descricao, igi.cod_grupo_interno, igi.descricao, ic.cod_curva, v.cod_cliente,
cd.nome, ci.descricao, ci.uf, CASE WHEN cd.cpf<>' ' THEN 'F' ELSE 'J' END, cl.descricao, vi.preco_unitario, vi.preco_contabil,
v.margem, v.controle|| '-' || v.serie, TO_CHAR(v.emissao, 'DD/MM/YYYY'), n.cod_natureza, n.descricao, eu.id_funcionario,
eu.nome_completo, eu.nome, eu.cod_funcao, v.numero_os, v.chassi_resumido, cd.bairro, v.controle|| '-' || v.serie,
pg.descricao,pg.cod_forma_pgto, os.tipo, ost.descricao, ed.cod_empresa_departamento, ic.custo_fornecedor`
【问题讨论】:
-
google 的第一个结果:
ORA-03113: end-of-file on communication channel. Cause: The connection between Client and Server process was broken.在我看来这不是查询问题。 -
“我无法访问 Oracle 日志,因为这个云对我们来说只是一个实例。” - 是的,但是管理云的人拥有该访问权限。因此,您需要与他们 交谈,因为您无法在不知道日志内容的情况下诊断 ORA-03113。当然,除了欣赏这个查询是多么可怕之外,我们无能为力:)
-
所以,我将尝试要求 Oracle 日志来确定问题...您不知道这个查询有多可怕...我有另一个比这个更大的没有连接,只是 from 子句中的所有表都用逗号...(只是为了开始)