Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcos Motta

RecordSet não retorna valores de uma Stored Procedure Oracle

Recommended Posts

Boa noite pessoal, depois de passar alguns dias procurando soluções e alterando o código várias vezes resolvi buscar ajuda de uma forma mais racional, ou seja, divulgando o problema. Então, se alguém puder ajudar!!!

 

O problema é o seguinte, a aplicação utiliza dois tipos de bancos de dados, SQL Server e Oracle e a 2 semanas atrás tive que criar uma procedure para trazer dados para um relatório, nada demais, tanto que produzir e utilizar a mesma em SQL Server foi muito tranquilo, o problema está em utilizar a mesma em Oracle, como se já não bastasse a 'tradução' da linguagem, utilizar a procedure está se mostrando tarefa das mais complicadas.

 

Para abreviar as discussões vou colocar os códigos de uma vez:

 

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  id_agent_soluc number,
  nome varchar2(50),
  valor_hh number(14,3),
  h_qtd_tipo_1 number(14,3),
  h_qtd_tipo_2 number(14,3),
  h_qtd_tipo_3 number(14,3),
  h_qtd_tipo_4 number(14,3),
  h_qtd_tipo_5 number(14,3),
  h_qtd_tipo_6 number(14,3),
  h_qtd_tipo_7 number(14,3)
) 
ON COMMIT DELETE ROWS;

 

CREATE OR REPLACE PACKAGE sp_relprojeto AS 
	TYPE t_cursor IS REF CURSOR ; 
	Procedure open_cursor 
  (
    P_DT_INICIO IN VARCHAR2, 
    P_DT_FIM IN VARCHAR2,
    P_ID_AGENTE IN NUMBER,
    P_ID_PROJETO IN VARCHAR2,
    P_ID_FASE IN VARCHAR2,
    P_RECORDSET IN OUT t_cursor
  ); 
END sp_relprojeto;

 

CREATE OR REPLACE PACKAGE BODY sp_relprojeto AS 
PROCEDURE open_cursor 
(
  P_DT_INICIO IN VARCHAR2, 
  P_DT_FIM IN VARCHAR2,
  P_ID_AGENTE IN NUMBER,
  P_ID_PROJETO IN VARCHAR2,
  P_ID_FASE IN VARCHAR2,
  P_RECORDSET IN OUT t_cursor) 
IS
  v_cursor t_cursor;
BEGIN
  INSERT INTO my_temp_table (id_agent_soluc, nome, valor_hh, h_qtd_tipo_1, h_qtd_tipo_2, h_qtd_tipo_3, h_qtd_tipo_4, h_qtd_tipo_5, h_qtd_tipo_6, h_qtd_tipo_7)
  select
    id_agent_soluc,
    nome_agente(P_ID_AGENTE),
    valor_hh_agente(P_ID_AGENTE),
    coalesce(sum(tipo_1), 0),
    coalesce(sum(tipo_2), 0),
    coalesce(sum(tipo_3), 0),
    coalesce(sum(tipo_4), 0),
    coalesce(sum(tipo_5), 0),
    coalesce(sum(tipo_6), 0),
    coalesce(sum(tipo_7), 0)
  from (
        select
              apo.id_agent_soluc,
              case when tipo = 1 then
                 valor
                 else 0
              end as tipo_1,
              case when tipo = 2 then
                 valor
                 else 0
              end as tipo_2,
              case when tipo = 3 then
                 valor
                 else 0
              end as tipo_3,
              case when tipo = 4 then
                 valor
                 else 0
              end as tipo_4,
              case when tipo = 5 then
                 valor
                 else 0
              end as tipo_5,
              case when tipo = 6 then
                 valor
                 else 0
              end as tipo_6,
              case when tipo = 7 then
                 valor
                 else 0
              end as tipo_7
        from (
              select
                    apo.id_agent_soluc,
                    apo.tp_hora_event as tipo,
                    SUM(ROUND((ROUND(((dt_final_event - dt_inici_event) * 86400),3)/3600),3)) as valor
              from
                    atendimento_pendencia_oserv apo
                    join ordem_servico os on (os.id_empre_oserv = apo.id_empre_oserv and os.id_filia_oserv = apo.id_filia_oserv and os.id_oserv = apo.id_oserv)
                    join projeto p on (os.id_proje = p.id_proje)
              where
                    apo.dt_inici_event between coalesce(to_date(P_DT_INICIO,'dd/mm/yyyy'),apo.dt_inici_event) and coalesce(to_date(P_DT_FIM,'dd/mm/yyyy'),apo.dt_inici_event) and
                    apo.id_agent_soluc = coalesce(P_ID_AGENTE, apo.id_agent_soluc) and
                    p.id_proje LIKE '%' || coalesce(P_ID_PROJETO, os.id_proje) || '%' and
                    (( os.id_regis_fase	= coalesce(P_ID_FASE,os.id_regis_fase)) or ( os.id_regis_fase < '5' and P_ID_FASE = '6' ))
              group by
                    apo.id_agent_soluc,
                    apo.tp_hora_event
              ) apo            
      ) n
  group by
    n.id_agent_soluc;
    
  OPEN v_cursor FOR
    SELECT id_agent_soluc, nome, valor_hh, h_qtd_tipo_1, h_qtd_tipo_2, h_qtd_tipo_3, h_qtd_tipo_4, h_qtd_tipo_5, h_qtd_tipo_6, h_qtd_tipo_7
    FROM   my_temp_table
    ORDER BY id_agent_soluc;
    
  P_RECORDSET := v_cursor;
  
END open_cursor;
END sp_relprojeto;

 

Existe informação na base e os valores inseridos na tabela my_temp_table após a execução da procedure são:

var p_dt_ini varchar2;
var p_dt_fim varchar2; 
var p_agente number; 
var p_projeto varchar2; 
var p_fase varchar2; 
var p_recordset REFCURSOR; 
exec :p_dt_ini := '01/01/2013'; 
exec :p_dt_fim := '27/03/2013'; 
exec :p_agente := 1; 
exec :p_projeto := 'ADM001'; 
exec :p_fase := '2'; 
execute sp_relprojeto.open_cursor (:p_dt_ini,:p_dt_fim,:p_agente,:p_projeto,:p_fase,:p_recordset); 
print p_recordset;

 

O resultado pode ser visto na tabela temporária:

 

id_agent_soluc | nome | valor_hh | h_qtd_tipo_1 | h_qtd_tipo_2| h_qtd_tipo_3 | h_qtd_tipo_4 | h_qtd_tipo_5 | h_qtd_tipo_6 | h_qtd_tipo_7 

1 | João Carlos | 0 | 0.004 | 0 | 0 | 0 | 0 | 0 | 0

 

 

O problema está na utilização pelo ASP, abaixo colocarei minha a função:

Dim Conn
Dim Cmd
Dim Rs
Dim Param1
Dim Param2
Dim Param3
Dim Param4
Dim Param5

Set Conn = server.createobject("ADODB.Connection")
Conn.ConnectionString = Session("conexao")	'Utiliza OraOLEDB
Conn.Open

Set Cmd = server.createobject("ADODB.Command")
Cmd.ActiveConnection = Conn

With Cmd

	.CommandText = "{ call sp_relprojeto_2.open_join_cursor (?,?,?,?,?,{resultset 0, P_RECORDSET}) }"
	.CommandType = 1

	Param1 = CStr("10/01/2012")
	Param2 = CStr("26/03/2013")
	Param3 = 1
	Param4 = CStr("ADM001")
	Param5 = CStr("2")

	' Set objparameter=objcommand.CreateParameter (name, type, direction, size, value)				
	.Parameters.Append	.CreateParameter("@P_DT_INICIO",  200, 1, 10, Param1)
	.Parameters.Append	.CreateParameter("@P_DT_FIM",     200, 1, 10, Param2)
	.Parameters.Append	.CreateParameter("@P_ID_AGENTE",  131, 1, Param3)
	.Parameters.Append	.CreateParameter("@P_ID_PROJETO", 200, 1, 10, Param4)
	.Parameters.Append	.CreateParameter("@P_ID_FASE",    200, 1,  6, Param5)

End With

Set rstMaodeObra = Cmd.Execute()  'O erro ocorre aqui

 

Neste ponto ocorre o seguinte erro:

 

OraOLEDB (0x80040E14)
ORA-06550: linha 1, coluna 55: PLS-00201: o identificador 'P_RECORDSET' deve ser declarado ORA-06550: linha 1, coluna 7: PL/SQL: Statement ignored

 

Já tentei de várias formas, mas não consigo achar o erro, se alguém puder dar uma mão, desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique a ortografia. isso pode ser um nome de coluna Invalido 'sua_coluna'. A coluna a qual você se refere na Base de Dados não foi encontrada. e também veja se os tipos de dados estão corretos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelo retorno xanburzum, já verifiquei isso várias vezes e acredito que do ponto de vista da procedure está tudo OK, os testes realizados dentro do SQLDeveloper retornaram valores sem erro algum, o que me leva de volta para o ASP, a informação de que P_Recordset não está declarado me deixou um pouco confuso, onde não está declarado, na procedure ou no ASP ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom se no SQLDeveloper retorna OK, não é erro de sintaxe. Os parâmetros estão corretos, pois a diferença do SQLDeveloper para o code pode ser a passagem de valores

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.