【问题标题】:ORA-03113 using PDOORA-03113 使用 PDO
【发布时间】: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 子句中的所有表都用逗号...(只是为了开始)

标签: php oracle pdo


【解决方案1】:

我向管理员询问了 Oracle 日志,它没有给我任何信息,管理员看到我的查询甚至到达了那里,然后我尝试了很多东西,最后我的老板找到了答案。他发现问题在于 PHP 通过我们与云的 VPN 连接发送的包的大小。所以解决方案(至少现在)是添加到 PDO 连接我们需要的大小,在连接字符串上使用:“(DESCRIPTION=(SDU=1400) ...”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多