oráculo novato erro instrução de atualização

votos
9

consulta oracle:

UPDATE AIRMODEL_NETWORK_SUMMARY 
SET CASES_PRODUCED = (SELECT DISTINCT PRDCTN_RUN_ACTL_CASE_QTY
                       FROM AIRMODEL_NETWORK_SUMMARY, HISTORY_PRODUCTION, PERIOD_TO_PROCESS
                      WHERE AIRMODEL_NETWORK_SUMMARY.FSCL_WK_IN_YR_NUM = HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM 
                        AND AIRMODEL_NETWORK_SUMMARY.FSCL_YR_NUM = HISTORY_PRODUCTION.FSCL_YR_NUM 
                        AND AIRMODEL_NETWORK_SUMMARY.LOC_ID = HISTORY_PRODUCTION.LOC_ID 
                        AND HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM = PERIOD_TO_PROCESS.FSCL_WK_IN_YR_NUM 
                        AND HISTORY_PRODUCTION.FSCL_YR_NUM = PERIOD_TO_PROCESS.FSCL_YR_NUM);

está retornando o seguinte erro:

ORA-01427: única linha subconsulta retorna mais de uma linha

Outra tentativa de correção:

 MERGE INTO AIRMODEL_NETWORK_SUMMARY AIRMODEL_NETWORK_SUMMARY1 
  USING (SELECT DISTINCT PRDCTN_RUN_ACTL_CASE_QTY, 
           AIRMODEL_NETWORK_SUMMARY2.rowid AS r 
      FROM AIRMODEL_NETWORK_SUMMARY AIRMODEL_NETWORK_SUMMARY2 
           INNER JOIN HISTORY_PRODUCTION 
              ON AIRMODEL_NETWORK_SUMMARY2.FSCL_WK_IN_YR_NUM = HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM 
                 AND AIRMODEL_NETWORK_SUMMARY2.FSCL_YR_NUM = HISTORY_PRODUCTION.FSCL_YR_NUM 
                 AND AIRMODEL_NETWORK_SUMMARY2.LOC_ID = HISTORY_PRODUCTION.LOC_ID 
           INNER JOIN PERIOD_TO_PROCESS 
              ON HISTORY_PRODUCTION.FSCL_WK_IN_YR_NUM = PERIOD_TO_PROCESS.FSCL_WK_IN_YR_NUM 
                 AND HISTORY_PRODUCTION.FSCL_YR_NUM = PERIOD_TO_PROCESS.FSCL_YR_NUM) 
   ON (AIRMODEL_NETWORK_SUMMARY1.rowid = r) 
 WHEN MATCHED THEN UPDATE 
  SET CASES_PRODUCED = PRDCTN_RUN_ACTL_CASE_QTY;

retorna o seguinte erro:

ORA-30926: não é possível obter um conjunto estável de linhas nas tabelas de origem

Eu sou um noob e precisam de ajuda :(

obrigado.

Publicado 02/10/2014 em 01:27
usuário
Em outras línguas...                            


1 respostas

votos
2

Você pode atribuir apenas um único valor, escalar a CASES_PRODUCED. Portanto, o seu subconsulta precisa produzir apenas um único valor, escalar.

Você precisa encontrar porque seu subconsulta retorna mais de uma linha.

SELECT DISTINCT ...irá selecionar linhas únicas, não o mesmo que ONE ROW.

Você precisa a soma total de todos os PRDCTN_RUN_ACTL_CASE_QTY nas linhas?

Ou a média?

Ou o número MAX?

Ou a primeira linha?

Usar uma função agregada se assim for:

Total

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT SUM(PRDCTN_RUN_ACTL_CASE_QTY) ...

Max

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT MAX(PRDCTN_RUN_ACTL_CASE_QTY) ...

Média

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT AVG(PRDCTN_RUN_ACTL_CASE_QTY) ...

Primeira linha

UPDATE AIRMODEL_NETWORK_SUMMARY 
    SET CASES_PRODUCED = (SELECT PRDCTN_RUN_ACTL_CASE_QTY ... 
                          FROM ... 
                          WHERE ROWNUM = 1)

É fundamental, especialmente quando se aprende, e lutando com a sintaxe, que você entenda claramente

  1. O que você precisa a partir da consulta
  2. O que sua consulta está retornando

Apenas tentando um monte de alternativas até chegar o sucesso é uma certeza fogo maneira de criar dados errados que parece funcionar.

Minha sugestão é primeiro copiar a subconsulta SELECTpara uma janela diferente e executá-lo, visualizar e entender os resultados. Deve ficar claro que é um resultado multi-linha. Trabalhar com a subconsulta até que ele está retornando um correto, resultado único, em seguida, ligá-lo de volta para a atualização maior.

Respondeu 02/10/2014 em 01:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more