- Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 4 meses atrás por
fsitja.
-
AutorPosts
-
4 de novembro de 2009 às 8:00 pm #90705
Anakim
ParticipanteComo eu faço para receber muitos valores em uma procedure?
Exemplo, tenho que receber vários dados, seria uma linha com várias colunas, que eu iria receber, sendo que não queria colocar “1 milhão de parâmetros” na chamada da procedure.4 de novembro de 2009 às 8:12 pm #90707diegolenhardt
ParticipanteSe todos forem campos de uma tabela faz um
parametro emp%rowtype e passa ele como parametro,
Se forem diferentes cria um TYPE e passa ele como parametro, mas daí terá de ser uma package.
4 de novembro de 2009 às 8:24 pm #90710Anakim
ParticipantePesquisando vi que o oracle trabalha com XML, também daria para fazer isso com XML? Teria algum exemplo? Qual a solução mais custosa para o banco?
4 de novembro de 2009 às 9:09 pm #90716diegolenhardt
ParticipanteUsei algumas vezes o xml,
tem que ver se o banco possui o recurso instalado,
select * from dba_registryeu acredito que o xml deva ser mais custoso, o rowtype acho que é o mais rápido, não se se poder ser aplicado nesse caso,
para o XML você passará um parametro do tipo XMLTYPE,
esse XML pode ser montado facilmente com um pacote não me recordo o nome, ele é capaz de construir um xml a partir de uma consulta SQL, retornando assim um XMLTYPE, ai do outro lado usa xml.extractValue para pegar os valores,
acho que fica bem mais simples com um table of record (Type),
7 de novembro de 2009 às 11:22 pm #90769Anakim
ParticipanteÉ resolvi usar o type e fiz da seguinte maneira:
Primeiramente criei um tipo:
CREATE OR REPLACE TYPE CUSTOMER_TYPE IS OBJECT(
T_NUMBER NUMBER,
T_VALUE VARCHAR( 50 ),);
Depois criei uma Collection deste tipo:
CREATE OR REPLACE TYPE CUSTOMER_TYPE_LIST AS TABLE OF CUSTOMER_TYPE
Para finalizar crei uma procedure aonde passo o tipo list que eu criei, mas da erro quando eu tento executar a procedure, o oracle fala que “function or procedure name not exist”.
Estou chamando assim:
call test_procedure( CUSTOMER_TYPE_LIST( CUSTOMER_TYPE (1, 'test') ));9 de novembro de 2009 às 1:12 am #90770burga
Participante[quote=”Anakim”:3lgnlpz5]Como eu faço para receber muitos valores em uma procedure?
Exemplo, tenho que receber vários dados, seria uma linha com várias colunas, que eu iria receber, sendo que não queria colocar “1 milhão de parâmetros” na chamada da procedure.[/quote]Neste caso, se você só quer passar “uma linha com várias colunas” não existe a necessidade de passar como parâmetro pro procedimento um tipo “AS TABLE OF” (CUSTOMER_TYPE_LIST) e sim direto o CUSTOMER_TYPE e passar direto o objeto com os valores.
[quote=”Anakim”:3lgnlpz5]Para finalizar crei uma procedure aonde passo o tipo list que eu criei, mas da erro quando eu tento executar a procedure, o oracle fala que “function or procedure name not exist”. [/quote]
Se puder colocar o código da sua procedure aqui seria melhor pra avaliarmos o erro. Mas já da pra você ver algumas coisas… Se a procedure estiver dentro de um pacote, então você deve chamá-la da seguinte maneira:
call pacote.test_procedure( CUSTOMER_TYPE_LIST( CUSTOMER_TYPE (1, ‘test’) ));
10 de novembro de 2009 às 4:18 am #90799fsitja
ParticipanteOu então tente:
BEGIN
test_procedure( CUSTOMER_TYPE_LIST( CUSTOMER_TYPE (1, 'test') ));
END;
Se você tiver que passar uma lista muito grande de linhas, acrescente na sua procedure a diretiva NOCOPY após o parâmetro, para que seja feita passagem por referência em vez de por valor.
CREATE OR REPLACE PROCEDURE test_procedure (tab IN OUT NOCOPY CUSTOMER_TYPE_LIST) IS
BEGIN
NULL; -- seu código...
END;
-
AutorPosts
- Você deve fazer login para responder a este tópico.