Criar Cursor na Procedure de tabelas com schema diferentes

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
junior.tordoya
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 27 Ago 2012 8:19 pm

Prezados,

Criei um cursor com dados de tabelas de 2 schemas " A e B " diferentes, estou criando no schema "A" a procedure e criei também sinônimos das tabelas do schema "B", porem não consigo compilar, pois o pl mostra "erro de tabela inexistente".
Para verificar se o sinônimo esta correto, executei um select no schema "A" e o mesmo trouxe as informações sem apresentar nenhum erro.

Como posso executar um cursor numa store procedure de tabelas de schemas diferente???

muito obrigado

junior.tordoya
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Opa.
Pelo que entendi você não está referenciando o dono("owner") das tabelas.

SEM OWNER:
po_lines_all

COM OWNER
po.po_lines_all

Se não for isso, explica melhor com exemplos.
junior.tordoya
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 27 Ago 2012 8:19 pm

segue exemplo:


estou acessando o schema teste 1, onde todas as tabelas pertencem a este esquema, menos a XMPRODUTO E XMDERIVACAO

Selecionar tudo

create or replace procedure SP_VENDA_COTACAO IS

CURSOR venda_quinze IS

SELECT LKP.CODIGOPRODUTO,
       LKP.CLASSEPRODUTO,
       LKP.TIPOUC,
       LKP.FATORTIPOUC,
       SUM(LKP.QUANTIDADEATUAL) AS QUANTIDADEATUAL,
       SUM(LKP.QUANTIDADEATUAL / LKP.FATORTIPOUC) AS QUANTIDADEATUALFATOR,
       SUM(LKP.QUANTIDADEBLOQUEADO) AS QUANTIDADEBLOQUEADO,
       SUM(LKP.QUANTIDADEBLOQUEADO / LKP.FATORTIPOUC) AS QUANTIDADEBLOQUEADOFATOR,
       SUM(LKP.QUANTIDADEEMPENHADO) AS QUANTIDADEEMPENHADO,
       LKP.CODIGOMATRIZ AS CODIGODEPOS,
       SUM(LKP.QUANTIDADEEMPENHADO / LKP.FATORTIPOUC) AS QUANTIDADEEMPENHADOFATOR,
       SUM(LKP.QUANTIDADERESERVA) AS QUANTIDADERESERVA,
       SUM(LKP.QUANTIDADEATUAL + LKP.QUANTIDADEBLOQUEADO +
           LKP.QUANTIDADEEMPENHADO) AS TOTAL,
       NVL(SUM(LKP.QUANTIDADEATUAL), 0) -
       NVL(SUM(LKP.QUANTIDADERESERVA), 0) AS QTD_DISPONIVEL_ESTOQUE,
        XMDERIVACAO.PREMED AS preço_MEDIO,
        TO_CHAR(SYSDATE,'DD/MM/YYYY') AS data_a,
        XMDERIVACAO.DESDER,
        XMPRODUTO.CODPRO,
        XMPRODUTO.DESPRO,
        XMPRODUTO.UNIMED
   FROM (SELECT LE.CODIGOPRODUTO,
               LES.CLASSEPRODUTO,
               LES.TIPOUC,
               LES.FATORTIPOUC,
               LES.QUANTIDADEATUAL,
               LES.QUANTIDADEBLOQUEADO,
               LES.QUANTIDADEEMPENHADO,
               LE.CODIGOMATRIZ,
               NVL((SELECT SUM(RES.QUANTIDADERESERVA)
                     FROM ENDERECORESERVA RES, COLETORMENSAGEM COL
                    Where RES.CODIGOESTABELECIMENTO =
                          LES.CODIGOESTABELECIMENTO
                      And RES.LOTEENTRADA = LES.LOTEENTRADA
                      AND RES.LOTEENTRADASEQUENCIA =
                          LES.LOTEENTRADASEQUENCIA
                      AND RES.TIPORESERVA = 2
                      AND RES.QUANTIDADERESERVA > 0
                      AND RES.CODIGOESTABELECIMENTO =
                          COL.CODIGOESTABELECIMENTO
                      AND RES.CODIGOMENSAGEM = COL.CODIGOMENSAGEM
                      AND COL.CODIGOTAREFA <> 170),
                   0) QUANTIDADERESERVA
          FROM LOTEENTRADA LE, LOTEENTRADASEQUENCIA LES
          WHERE LE.CODIGOESTABELECIMENTO = LES.CODIGOESTABELECIMENTO
           AND LE.LOTEENTRADA = LES.LOTEENTRADA
           AND LE.CODIGOESTABELECIMENTO = 1
           --AND (LE.CODIGOMATRIZ = '11')
           AND LES.CLASSEPRODUTO = 'OK') LKP
           LEFT JOIN XMDERIVACAO
           ON Decode(INSTR(LKP.CODIGOPRODUTO, '.'),
                      0,
                      NULL,
                      Substr(LKP.CODIGOPRODUTO,
                             INSTR(LKP.CODIGOPRODUTO, '.') -
                             LENGTH(LKP.CODIGOPRODUTO),
                             4)) = XMDERIVACAO.CODDER
           AND Decode(INSTR(LKP.CODIGOPRODUTO, '.'),
                      0,
                      LKP.CODIGOPRODUTO,
                      Substr(LKP.CODIGOPRODUTO,
                             1,
                             INSTR(LKP.CODIGOPRODUTO, '.') - 1)) =
               DER.CODPRO
           LEFT JOIN XMPRODUTO
            ON Decode(INSTR(LKP.CODIGOPRODUTO, '.'),
                      0,
                      LKP.CODIGOPRODUTO,
                      Substr(LKP.CODIGOPRODUTO,
                             1,
                             INSTR(LKP.CODIGOPRODUTO, '.') - 1)) =
               XMPRODUTO.CODPRO
               
Having SUM(LKP.QUANTIDADEATUAL + LKP.QUANTIDADEBLOQUEADO + LKP.QUANTIDADEEMPENHADO) > 0

GROUP BY LKP.CODIGOPRODUTO, LKP.CLASSEPRODUTO, LKP.TIPOUC, LKP.FATORTIPOUC,XMDERIVACAO.PREMED,
XMDERIVACAO.DESDER,XMPRODUTO.CODPRO,XMPRODUTO.DESPRO,XMPRODUTO.UNIMED,LKP.CODIGOMATRIZ;

 venda_1 venda_quinze%ROWTYPE;
	
	BEGIN
	.......

foi criado os sinominos:

create or replace synonym XMPRODUTO
for teste2.produto;

create or replace synonym XMDERIVACAO
for teste2.derivacao;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Depois de você criar:
"create or replace synonym XMPRODUTO
for teste2.produto;"

você consegue fazer um select tanto em "XMPRODUTO" quanto em "teste2.produto"?
Tentou colocar "teste2.produto" na procedure diretamente assim?

Agora outro detalhe. É bem doloroso esse teu join com essas tabelas, cheios de substrings, decodes...
Existe falha de projeto desse sistema que você está mechendo.
Responder
  • Informação