Matheus
Criei a proc e a func na minha maquina e realmente não existe nenhum
problema na execução.
Tente executar a proc na sua maquina, os valores que incluir como parametros
são apenas para teste pois minha tabela está sem dados, para dos os campos
da tabela DEPTO eu coloquei como VARCHAR2(10)
qq coisa me avise
SQL>
SQL>
SQL> declare
2 v_ret varchar2(100);
3 begin
4 -- Call the procedure
5 prc_atualiza_depto('1','1','1','1',v_ret);
6 dbms_output.put_line( v_ret );
7 end;
8 /
NÃO EXISTE O DEPARTAMENTO 1!
PL/SQL procedure successfully completed.
SQL>
2009/11/18 Roberto Oshikawa <[email protected]>
> Matheus,
>
> Vou criar essa proc e a func nna minha máquina, mas posso garantir que não
> existe nada em especial qdo vc manda executar um func ou proc que utilize
> parametros iguais
>
> se vc está usando uma variável do tipo varchar2 ela não precisa ser
> utilizada com apostrofo na execução
>
> exemplo :
>
>
> Procedure teste
> *variavel1 *varchar2(100);
>
> begin
> ......
> .
> .
> if estouchamando_a_func(*variavel1*) = '1234'then
> raise error
> end if;
> end;
>
> end
>
> em todo o caso estarei criando esse codigo na minha maquina e te retorno
>
>
>
> 2009/11/18 Matheus Malta <[email protected]>
>
>>
>>
>> Então Roberto... Só recapitulando...
>>
>> - O ambiente é o SQLPlus;
>> - O parâmetro IN da func é do tipo VARCHAR2;
>> - O parâmetro IN da proc é do tipo VARCHAR2;
>>
>> Estou tentando executar a func isoladamente, para ver como chamar o
>> parâmetro e, pelo que eu percebo, eu tenho sempre que, ao passar o
>> parâmetro, colocá-lo entre APÓSTROFES('), pois é um elemento tipo TEXTO.
>>
>> Penso que talvez possa ser isto, mas aí cabe a minha pergunta: como passar
>> o parâmetro tipo texto dentro da proc de maneiras que, quando a func tiver
>> que ler o parâmetro, ela também o leia como texto.
>>
>> Tentei colocar entre apóstrofes a variável(conforme visto na proc) mas
>> ainda não está dando certo...
>>
>> Prosseguirei com os testes aqui... Qualquer novidade que você econtrar e
>> puder me avisar, ficarei grato...
>>
>> Falows!
>>
>>
>> Matheus Malta
>> ----- Original Message -----
>> From: "Roberto Oshikawa" <[email protected] <rcoshikava%40gmail.com>>
>> To: <[email protected] <oracle_br%40yahoogrupos.com.br>>
>> Sent: Wednesday, November 18, 2009 4:38 PM
>> Subject: Re: [oracle_br] Function - PL/SQL
>>
>> Matheus,
>>
>> Sendo bem sincero não consegui identificar o erro da proc ou da func, a
>> meu
>> entender a chamada da func está correta, porém normalmente não faço dessa
>> forma, eu utilizo
>>
>> if func() = v_Resultado then
>> raise erro
>> end if
>>
>> 2009/11/18 Matheus Malta <[email protected]<maltamatheus%40gmail.com>
>> >
>>
>> >
>> >
>> > Então...
>> >
>> > O objetivo é executar a procedure e a procedure (durante sua execução)
>> vai
>> > chamar uma func, que vai se utilizar do mesmo parâmetro de entrada da
>> > procedure(no caso, o valor passado na variável v_cdepto), trazer um
>> valor
>> > pra dentro da procedure e a procedure continuar sua execução até o
>> final,
>> > tal como especificado abaixo, na proc:
>> >
>> > CREATE OR REPLACE PROCEDURE prc_atualiza_depto
>> > (
>> > v_cdepto IN depto.cd_depto%TYPE,
>> > V_depto IN depto.nm_depto%TYPE,
>> > v_ger IN depto.cd_gerente%TYPE,
>> > v_cdepto_ctb IN depto.cd_depto_ctb%TYPE,
>> > v_ret OUT VARCHAR2
>> > )
>> >
>> > IS
>> > -- Declaração das variáveis
>> > v_ver NUMBER;
>> > v_erro EXCEPTION;
>> >
>> > BEGIN
>> >
>> > -- Verifica se existe o Depto
>> > -- Aqui a função será usada
>> > v_ver := fn_verifica_depto(upper('v_cdepto'));
>> >
>> > IF v_ver = 0
>> > THEN RAISE v_erro;
>> > END IF;
>> >
>> > -- Atualiza o Depto
>> > UPDATE depto
>> > SET nm_depto = UPPER(v_depto),
>> > cd_gerente = v_ger,
>> > cd_depto_ctb = UPPER(v_cdepto_ctb)
>> > WHERE cd_depto = UPPER(v_cdepto);
>> >
>> > v_ret := 'REGISTRO ATUALIZADO!';
>> > COMMIT;
>> >
>> > EXCEPTION
>> > WHEN v_erro THEN
>> > v_ret := 'NÃO EXISTE O DEPARTAMENTO '||UPPER(v_cdepto)||'!';
>> > ROLLBACK;
>> >
>> > WHEN OTHERS THEN
>> > v_ret := SQLERRM;
>> > ROLLBACK;
>> >
>> > END;
>> >
>> > A função que está sendo usada na proc acima é a seguinte:
>> >
>> > CREATE OR REPLACE FUNCTION fn_verifica_depto
>> > (v_cdepto IN depto.cd_depto%TYPE)
>> > RETURN NUMBER
>> >
>> > IS
>> >
>> > --Verifica a existência do Departamento
>> > v_ver NUMBER;
>> >
>> > BEGIN
>> >
>> > SELECT COUNT(cd_depto) INTO v_ver
>> > FROM depto
>> > WHERE cd_depto = v_cdepto;
>> >
>> > RETURN v_ver;
>> >
>> > END;
>> >
>> > É isso...
>> >
>> > Desde já agradeço!
>> >
>> > Atenciosamente,
>> >
>> >
>> > Matheus Malta
>> > ----- Original Message -----
>> > From: "Roberto Oshikawa" <[email protected]
>> > <rcoshikava%40gmail.com><rcoshikava%
>> 40gmail.com>>
>> > To: <[email protected]
>> > <oracle_br%40yahoogrupos.com.br><oracle_br%
>> 40yahoogrupos.com.br>>
>> > Sent: Wednesday, November 18, 2009 12:08 PM
>> > Subject: Re: [oracle_br] Function - PL/SQL
>> >
>> > Matheus,
>> >
>> > desculpa mas não entendi direito, vc está querendo chamar a func dentro
>> da
>> > proc ou criar uma func dentro da proc ? Ou viajei e não eh nada disso ?
>> >
>> > 2009/11/18 Matheus Malta <[email protected]<maltamatheus%40gmail.com>
>> <maltamatheus%40gmail.com>
>>
>> > >
>> >
>> > >
>> > >
>> > > Roberto... Penso que o problema inicial esteja sendo o fato de como
>> > chamar
>> > > a função mesmo...
>> > >
>> > > Estou com uma função aqui parecida com essa, em que o parâmetro a ser
>> > > passado é do tipo VARCHAR2...
>> > >
>> > > Ao referenciar a função numa procedure, ele retorna a mensagem do
>> erro,
>> > > como senão houvessem dados a serem trazidos...
>> > >
>> > > Penso ser este o problema incialmente...
>> > >
>> > > Assim sendo (e aproveitando o ensejo) como posso referenciar uma
>> função
>> > > dentro de uma procedure, considerando que o valor da variável que vai
>> ser
>> > > atribuído na função é do tipo TEXTO?
>> > >
>> > > Valew!
>> > >
>> > > Matheus Malta
>> > >
>> > >
>> > > ----- Original Message -----
>> > > From: "Roberto Oshikawa"
>> > > <[email protected]<rcoshikava%40gmail.com><rcoshikava%
>> 40gmail.com><rcoshikava%
>> > 40gmail.com>>
>> > > To: <[email protected]
>> > > <oracle_br%40yahoogrupos.com.br><oracle_br%
>> 40yahoogrupos.com.br><oracle_br%
>> > 40yahoogrupos.com.br>>
>> > > Sent: Wednesday, November 18, 2009 11:48 AM
>> > > Subject: Re: [oracle_br] Function - PL/SQL
>> > >
>> > > Matheus,
>> > >
>> > > vc poderia utilizar array ou type para retornar 1 ou mais registros,
>> esse
>> > > tipo de variavel é igual a uma tabela e vc vai atribuindo os valores
>> > dentro
>> > > do for
>> > >
>> > > se tiver dúvida me avisa que vamos conversando
>> > >
>> > > outra opção dependendo do retorno é ir concatenando os valores dentro
>> da
>> > > function e ir colocando algum delimitador para que vc saiba onde
>> começa e
>> > > onde termina o objeto que vc está procurando
>> > >
>> > > []s
>> > >
>> > > Roberto Oshikawa
>> > >
>> > > 2009/11/18 Matheus Malta
>> > > <[email protected]<maltamatheus%40gmail.com>
>> <maltamatheus%40gmail.com>
>> > <maltamatheus%40gmail.com>
>> >
>> > > >
>> > >
>> > > >
>> > > >
>> > > > Pessoal...
>> > > >
>> > > > Estou criando uma função que me traga os nomes do objetos do meu
>> > schema,
>> > > > considerando o tipo objetos que é passado como parâmetro de
>> entrada...
>> > > >
>> > > > No entanto, estou tendo dificuldades (ou não estou sabendo) como
>> > executar
>> > > a
>> > > > função de maneira que ela me retorne os valores que eu quero...
>> Alguém
>> > aí
>> > > > poderia me ajudar? É possível uma function trazer mais do que uma
>> > linha?
>> > > >
>> > > > Valew...
>> > > >
>> > > > Segue a função:
>> > > > CREATE OR REPLACE FUNCTION fn_ver_objetos
>> > > > (v_otipo IN varchar2)
>> > > > RETURN VARCHAR2
>> > > >
>> > > > IS
>> > > >
>> > > > v_oname varchar2(20);
>> > > >
>> > > > CURSOR objetos is
>> > > > select object_name from user_objects
>> > > > where object_type = v_otipo;
>> > > >
>> > > > BEGIN
>> > > >
>> > > > open objetos;
>> > > >
>> > > > loop
>> > > >
>> > > > fetch objetos into v_oname;
>> > > > exit when objetos%notfound;
>> > > >
>> > > > IF SQL%NOTFOUND
>> > > > THEN RETURN 'NÃO EXISTEM OBJETOS DESTE TIPO!';
>> > > >
>> > > > ELSE
>> > > > RETURN v_oname;
>> > > >
>> > > > END IF;
>> > > >
>> > > > end loop;
>> > > >
>> > > > close objetos;
>> > > >
>> > > > END;
>> > > >
>> > > > SCRIPT PARA CHAMAR A FUNÇÃO:
>> > > > accept tipo prompt 'INFORME O TIPO: '
>> > > >
>> > > > DECLARE
>> > > > v_fn VARCHAR2(10):= '&tipo';
>> > > > v_mostra VARCHAR2(100);
>> > > > BEGIN
>> > > >
>> > > > v_mostra := fn_ver_objetos(v_fn);
>> > > >
>> > > > DBMS_OUTPUT.PUT_LINE(v_mostra);
>> > > > end;
>> > > >
>> > > > Valew pessoal!
>> > > >
>> > > > Matheus Malta
>> > > >
>> > > > [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/[email protected]/
>> > > ----------------------------------------------------------
>> > > >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
>> > >
>> > >
>> > > [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/[email protected]/
>> > ----------------------------------------------------------
>> > >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
>> >
>> > [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/[email protected]/
>> ----------------------------------------------------------
>> >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
>>
>> [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/[email protected]/
--------------------------------------------------------------------------------------------------------------------------
>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:
[email protected]
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html