Opa, como Vai Eduardo.

Bem... aprecio o fato de estar estudando Oracle e fico muito satisfeito por
poder te ajudar com essa dúvida.

Vamos lá.

Imagino, após ler sua procedure, que está tentando fazer com que essa te
retorne nos parâmetros do tipo OUT as linhas retornadas pelo select,
correto?

Pelo que li também no que o Chiappa Escreveu, essa sua query retorna mais de
uma Linha. (ATÉ PORQUE EXISTEM UNIONS em sua query).

Bom, vou tentar explicar de uma forma simples (o que é obvio.. deeer... pois
do q adiantaria eu complicar mais.. rss).

Primeiro.
Declaranto parâmetros OUT de tipos primitivos em procedures faz com que a
procedure retorne somente UM valor para cada parâmetro.

Pense em Tipo de Dado Primitivo como tipo de dado Original.
Ou seja:
Numérico, Literal, Data, etc.

(Antes que alguém diga que isso não é tipo de dado primitivo, eu digo: Usei
o termo "Primitivo" apenas para tentar deixar mais fácil a explicação... e
não estou me referenciando a tipos de dados primitivos como visto em Java ou
C++, ok?)

Ou seja.
Cada parâmetro de tipo primitivo da procedure pode-se retornar somente UM
valor primitivo.

Exemplo:

Um parâmetro do tipo Number, pode receber UM e somente UM valor numérico, ou
seja:
0 ou 1 ou 2 ou 3.
Nunca
0 e 1 e 2 e 3.

Compreende?


Obs: Para retornar mais de um valor por parâmetro é preciso trabalhar com
tipos de dados complexos, como Arrays (Vetores).
Array no Oracle é tratado/conhecido como conjunto (ou tabela) de dados.
São criados dessa forma:
<nome_do_array> IS TABLE OF <tipo_de_dado>;

Exemplo.
num_array IS TABLE OF NUMBER(6);

Dessa forma criamos um array do tipo de dados NUMBER.
Cada elemento do array é manipulado através de um indice ou ponteiro. Dessa
forma:

num_array[1] := 38;
num_array[2] := 29;

Dê uma pesquisada mais a fundo sobre isso caso queira saber mais.


Segundo ponto que vejo errado em sua procedure.

Você tentou iniciar um laço de repetição (FOR) mas não disse onde esse laço
termina.

Para um laço de repetição em PL/SQL é preciso que diga ao interpretador onde
ele começa e onde ele termina.

A sintaxe mais simples desse tipo de for que vc tentou usar é a seguinte:

...
FOR <nome_do_cursor> IN (instrução select) LOOP
[procedimento que deve ser repetido]
END LOOP;
...

Veja em sua procedure a difereça.

Compreende?

Um exemplo simples é o seguinte:

Suponhamos que temos a seguinte tabela de nome EMP, que pertence ao usuário
SCOTT.

Tabela: SCOTT.EMP
EMPNO NUMBER(6)
ENAME VARCHAR2(40)
MGR NUMBER(6)

temos os seguintes valores para essa tabela:

EMPNO   ENAME      MGR
1              King
2              Ane            1
3              Tylor           1
4              Jill              2

Agora, considere o seguinte bloco PL/SQL anonimo.

DECLARE
BEGIN

    FOR rec IN (select ENAME as nome_empregado from SCOTT.EMP) LOOP

        dbms_output.print_line('Nome: ' || rec.nome_empregado);

    END LOOP;

END;

O Resultado em tela desse bloco pl/sql deve ser o seguinte:

Nome: King
Nome: Ane
Nome: Tylor
Nome: Jill


Consegue compreender como funciona um laço FOR?

Bom, espero que com isso eu tenha te ajudado o mínimo que seja.

Forte abraço e continue com os estudos.

Evandro Giachetto
Oracle SQL Expert
Oracle Certified Associate
evan...@clickinterativa.com.br


Em 18 de junho de 2010 20:19, José Laurindo <jlchia...@yahoo.com.br>escreveu:

>
>
> Eduardo, penso que há um equívoco Fundamental por parte lá do outro colega,
> um que a query no FROM ** não vai ** solucionar: ocorre que o INTO ,por
> DEFINIÇÃO, traz apenas UMA LINHA DE RESULTADO, e um UNION , óbvio, vai
> trazer uma linha ao menos da query 1, OUTRA linha ao menos da query2, outra
> ao menos da query 3 sendo unida... Percebeu o problema ? Ele está tentando
> usar um construto que só aceita UMA linha (o INTO) com uma sintaxe que traz
> unidas VÁRIAS linhas, há uma DISPARIDADE óbvia aí...
> Por isso o correto é abrir CURSOR...
>
> []s
>
> Chiappa
>
> --- Em oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br>,
> Eduardo Schurtz <eduardo.schu...@...> escreveu
> >
> > Boa tarde.
> >
> > Você não pode jogar o "INTO" desse jeito, ele tem que ficar sempre depois
> do
> > SELECT e antes do FROM.
> >
> > Como você está usando UNION, tenta fazer assim (Joguei toda a sua query
> no
> > FROM, como se fosse uma tabela:
> >
> > select sete
> > ,doze
> > ,total
> > ,icms
> > from (select sum(cd.icms) as sete
> > ,cast(null as number) as doze
> > ,cast(null as number) as total
> > ,cast(null as number) as ICMS
> > from sis_ctrc_contabilidade_detail cd
> > where cd.aliquota = 7
> > and cd.idctrcpai = 10
> > group by cast(null as number)
> > ,cast(null as number)
> > ,cast(null as number)
> > union all
> > select cast(null as number) as sete
> > ,sum(cd.icms) as doze
> > ,cast(null as number) as total
> > ,cast(null as number) as ICMS
> > from sis_ctrc_contabilidade_detail cd
> > where cd.aliquota = 12
> > and cd.idctrcpai = 10
> > union all
> > select cast(null as number) as sete
> > ,cast(null as number) as doze
> > ,sum(cd.valor) as total
> > ,cast(null as number) as ICMS
> > from sis_ctrc_contabilidade_detail cd
> > where cd.idctrcpai = 10
> > union all
> > select cast(null as number) as sete
> > ,cast(null as number) as doze
> > ,cast(null as number) as total
> > ,sum(cd.icms) as ICMS
> > from sis_ctrc_contabilidade_detail cd
> > where cd.idctrcpai = 10 into sete, doze, total, icms)
> > into sete
> > ,doze
> > ,total
> > ,icms
> > from dual;
> >
> > Veja se funciona.
> >
> > Entendeu? Isso que importa.
> >
> > Att,
> >
> > __________________________
> > *Eduardo Schurtz*
> > Oracle E-Business Consultant
> > eduardo.schu...@...
> > [image: LinkedIn] <http://br.linkedin.com/in/eduardoschurtz>[image:
> > Twitter]<http://twitter.com/eduardo_oracle>
> >
> >
> > 2010/6/18 rodrigo <galvao...@...>
> >
> > >
> > >
> > > Olá, sou iniciante em Oracle, estou tentando aprender a usar o Oracle
> 10xe,
> > > tenho a seguinte procedure abaixo, deve ter algum erro de sintaxe,
> > > executando somente o sql no oracle retorna os valores certos, mas não
> > > consegui fazer a procedure funcionar:
> > >
> > > CREATE OR REPLACE PROCEDURE PROC_TOTAL_CTRC_CONTABILIDADE
> > > (
> > > CODIGO IN NUMBER
> > > , SETE OUT NUMBER
> > > , DOZE OUT NUMBER
> > > , TOTAL OUT NUMBER
> > > , ICMS OUT NUMBER
> > > ) AS
> > > BEGIN
> > > for
> > > select sum(cd.icms) as sete, cast(null as number) as doze, cast(null as
> > > number)as total, cast(null as number) as ICMS
> > > from sis_ctrc_contabilidade_detail cd
> > > where cd.aliquota=7 and cd.idctrcpai=10 group by cast(null as number),
> > > cast(null as number), cast(null as number)
> > > union all
> > > select cast(null as number) as sete, sum(cd.icms) as doze, cast(null as
> > > number)as total, cast(null as number)as ICMS
> > > from sis_ctrc_contabilidade_detail cd
> > > where cd.aliquota=12 and cd.idctrcpai=10
> > > union all
> > > select cast(null as number) as sete, cast(null as number)as doze,
> > > sum(cd.valor) as total, cast(null as number)as ICMS
> > > from sis_ctrc_contabilidade_detail cd
> > > where cd.idctrcpai=10
> > > union all
> > > select cast(null as number) as sete, cast(null as number)as doze,
> cast(null
> > > as number) as total, sum(cd.icms) as ICMS
> > > from sis_ctrc_contabilidade_detail cd
> > > where cd.idctrcpai=10
> > > into sete, doze, total, icms;
> > >
> > > END PROC_TOTAL_CTRC_CONTABILIDADE;
> > >
> > > Poderiam me dizer onde estou errando? o erro que o compilador aponta é
> o
> > > seguinte:
> > > Erro(10,2): PL/SQL: SQL Statement ignored
> > > Erro(25,2): PL/SQL: ORA-00933: comando SQL não encerrado adequadamente
>
> > >
> > >
> > >
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



------------------------------------

--------------------------------------------------------------------------------------------------------------------------
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  
------------------------------------------------------------------------------------------------------------------------
 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Responder a