Depois de ler a seção ' Definindo um procedimento SQL ' do DB2 UDB para iSeries SQL Programming Concepts V5R2 e a seção ' Retornando conjuntos de resultados de procedimentos armazenados ' do Centro de Informações do i5/OS, Versão 5 Release 4, criei o seguinte procedimento armazenado:
CREATE PROCEDURE TESTDAT.REPORT (IN DATESTART DATE, IN DATEEND DATE)
LANGUAGE SQL READS SQL DATA
BEGIN
DECLARE CSR1 CURSOR WITH RETURN FOR
SELECT *
FROM SYSIBM.SYSDUMMY1;
OPEN CSR1;
RETURN;
END
Em seguida, li a seção 'Exemplo 1: Chamando um procedimento armazenado que retorna um único conjunto de resultados' do mesmo i5/OS Information Center, Versão 5 Release 4 e tentei chamar esse procedimento do cliente SqlDbx (via ODBC) ou do relatório SSRS (via provedor IBMDASQL) usando a instrução abaixo:
CALL TESTDAT.REPORT (DATE('11/01/2013'), DATE('11/03/2013'));
Ele foi executado com sucesso, mas não retornou o conjunto de resultados. Executar isso através do navegador iSeries retorna com sucesso 2 instruções - selecione e declare o cursor. Chamando
SELECT * FROM SYSIBM.SYSDUMMY1;
retorna a coluna IBMREQD com 1 linha de 'Y'. O que estou perdendo nos documentos acima?
Atualizar:
O SQL gerado para este procedimento inclui outras opções além das já discutidas:
SPECIFIC TESTDAT.REPORT
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
Algum deles pode afetar o retorno do conjunto de resultados para o SSRS?
Uma coisa que está faltando em sua declaração de procedimento armazenado é a
DYNAMIC RESULT SETS
opção. O valor padrão para essa opção é 0, pode ser isso que confunde o software cliente. Se ele (o software cliente) pode manipular cursores retornados por um procedimento armazenado é outra história.A solução para relatar o procedimento armazenado SQL do iSeries no SSRS é instalar o provedor DB2UDB .Net fornecido com o IBM Client Access no BIDS, incluindo duas tags XML no RSReportDesigner.config.
Adicione o seguinte à
<Data>
tag em .config:Adicione o seguinte à
<Designer>
tag:Isso adicionará DB2UDB a uma lista de provedores nas propriedades da fonte de dados. Então você pode usar uma string de conexão com o seguinte formato nas fontes de dados:
O ID do usuário e a senha precisam ser inseridos na string de conexão, pois o provedor não poderá usá-los se inseridos na guia Credenciais.
O assistente de relatório do SSRS não pode criar um relatório com base em um SP. Em vez disso, deve ser usado um relatório baseado em uma instrução de seleção temporária (
select * from sysibm.sysdummy1
ou qualquer outra seleção rápida serviria).Depois que um relatório é criado, seu tipo de conjunto de dados pode ser alterado de consulta para procedimento armazenado. O nome do SP deve ser inserido manualmente (o menu suspenso está vazio). Os parâmetros devem ser inseridos manualmente (não atualizará os campos até que os parâmetros sejam inseridos). Os nomes dos parâmetros precisam corresponder ao SP e aos valores dos parâmetros inseridos como
[@<param name>]
. Os parâmetros de data devem ser especificados como tipo de texto ou data/hora com expressão de valor semelhante a esta:Se estiver usando o tipo Texto, insira as datas sem aspas, ex: 31/10/2013
O iSeries Navigator não "retornou" duas instruções. Ele os ecoou na guia de mensagens, NÃO na guia de resultados de dados.
SYSIBM.SYSDUMMY1 é uma tabela fornecida pela IBM com 1 coluna e uma linha. Você obteve a resposta correta para o procedimento que escreveu.
SYSDUMMY1 geralmente é usado no código de exemplo como um proxy para avaliar expressões que não requerem nenhuma tabela. Por exemplo:
No entanto, essa é uma construção desnecessária, pois a instrução VALUES também funciona nessas situações e não requer tabela ou exibição como fonte de dados
Onde SELECT INTO seria usado, VALUES INTO é o equivalente.
Portanto, agora que eliminamos sua necessidade de usar o SYSDUMMY1, a questão permanece: o que você está tentando realizar?