Executar proc c/ Parâmetro do tipo cursor

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
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Pessoal, mais uma vez preciso da ajuda de vocês.

Tenho uma procedure que possui alguns parâmetro, entre os de entrada e saída, porém existe um que talvez possa chamá-lo de "híbrido" (não sei se é o termo certo), o certo é que ele foi declarado como IN/OUT e seu tipo recebe o resultado de um cursor, ficando como abaixo:

Selecionar tudo


  P_PARAMETRO     IN OUT Utl_Type.TCURSOR


E no meio do código tenho algo assim:

Selecionar tudo

  OPEN P_PARAMETRO FOR
    SELECT
	  *
      FROM
	 TABELA; -- fiz o teste e a mesma esta retornando um resultado de várias colunas em branco;
Tenho no total sete parâmetros. A minha dúvida é, como eu passo esse parâmetro para poder executar a procedure manualmente para efetuar meus testes? Neste caso sendo IN/OUT é obrigatório a passagem de algum valor? Para isso faço assim:

Selecionar tudo


BEGIN
  NOME_PROCEDURE(P_PARAMETRO,P_PARAMETRO,P_PARAMETRO,P_PARAMETRO,P_PARAMETRO,P_PARAMETRO,P_PARAMETRO,);
END;

-- onde o último parâmetro é o tipo que retorna o resultado de um cursor;

Ao tentar executá-la recebo a seguinte mensagem:

Selecionar tudo


ORA-06550: line 6, column 3:
PLS-00306: wrong number or types of arguments in call to '<NOME_PROCEDURE>'
ORA-06550: line 6, column 87:
PLS-00363: expression '0' cannot be used as an assignment target
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored

Se alguém puder me auxiliar fico no aguardo.

Grato.
LixX
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 21 Jan 2010 4:40 pm
Localização: Porto Alegre - RS

Acabei de fazer um código em outro tópico que fazia chamada de procedure com sys_refcursor, vê se te ajuda:

http://glufke.net/oracle/viewtopic.php?t=6643

[]'s
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Senhores, perdoem-me ressuscitar este tópico, porém estou passando a mesma dificuldade novamente.

Estou tentando executar uma sequencia de procedures manualmente, porém o parâmetro P_RESULTADO da minha declaração é um parâmetro de entrada e saída do tipo Utl_Type.TCURSOR, tentei passar nulo, zero, em branco (' '), porém dá o seguinte erro:

Selecionar tudo


ORA-06550: line 21, column 18:
PLS-00382: expression is of wrong type
ORA-06550: line 21, column 3:
PL/SQL: Statement ignored
ORA-06550: line 23, column 3:
PLS-00306: wrong number or types of arguments in call to 'STORED_PROCEDURE'
ORA-06550: line 23, column 3:
PL/SQL: Statement ignored

Eu sei que este tipo de dado é usado para retornar o resultado de um cursor, mas no momento de executar esta query manualmente o que eu devo passar como parâmetro, este tipo de dado não aceita valor nulo?

Por favor, poderiam me ajudar?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Se o tal parâmetro em sua procedure for tipo IN OUT você precisa obrigatoriamente informar uma variável. O compilador necessita retornar um valor e "null" não serve nesse caso.

Apenas declare uma variável qualquer do tipo Utl_Type.TCURSOR e use no parâmetro. Pode descartá-la, sem usar o valor sem problemas se é o que você quer.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Desculpe-me colega, eu entendi o que disse mas não consegui fazer, talvez fique mais fácil de visualizar o que eu preciso se eu dispuser o código, segue abaixo:

Selecionar tudo


DECLARE 
  P_DIRETORIO  VARCHAR2(200);
  P_DATAINI    DATE;
  P_DATAFIM    DATE;
  P_OPERADORA  VARCHAR2(200);
  P_CLIENTE    VARCHAR2(200);
  P_GRUPO      VARCHAR2(200);
  P_TIPOUSER   VARCHAR2(200);
  P_NOTA       VARCHAR2(200);
  P_CLI_CODIGO VARCHAR2(200);   
  P_RESULTADO  Utl_Type.TCURSOR;  
  VRESULT      Utl_Type.TCURSOR;
  
BEGIN  
  P_DATAINI   := '01-NOV-2010';
  P_DATAFIM   := '30-NOV-2010';
  P_OPERADORA := 'CT000000';
  P_CLIENTE   := 'T';
  P_GRUPO     := 'T';
  P_TIPOUSER  := 'N';
  P_NOTA      := '9999999999';
--  P_RESULTADO := VRESULT;--'';

  USEROPER.SP_PROC_I ( P_DATAINI, 
                             P_DATAFIM, 
                             P_OPERADORA, 
                             P_CLIENTE, 
                             P_GRUPO, 
                             P_TIPOUSER, 
                             P_NOTA,
--                             P_RESULTADO); 
                             VRESULT);
  COMMIT; 
  
  P_DIRETORIO := '<CAMINHO>';
  P_CLI_CODIGO := '00000XXX';

  USERTI.SP_PROC_II ( P_DIRETORIO, 
                                       P_DATAINI, 
                                       P_DATAFIM, 
                                       P_OPERADORA, 
                                       P_CLIENTE, 
                                       P_GRUPO, 
                                       P_NOTA, 
                                       P_CLI_CODIGO );
  COMMIT; 
END;  

Tentei das duas formas (o que está comentado), porém o erro persiste.

Att.,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes