Ir para conteúdo

POWERED BY:

Arquivado

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

JhonyMega

Procedure SELECT

Recommended Posts

Ola pessoal tava fazendo uma procedure quando tive este problema, preciso retornar um SELECT convencional e uma amigo meu disse paa usar %rowtype para preparar os valores de cada celula. Mas ele retorna epnas a primeira linha de cada coluna. Como teria de mudar este COD para devolver o SELECT simples com colunas e linhas normais ?

 

create or replace procedure teste_select is

cursor curTeste is (SELECT  t.tar_dt_cadastro,t.tar_va_nome FROM orl_tarefas t
WHERE t.tar_in_codigo < 10);
resTeste  curTeste%rowtype;
begin
      Open curTeste;
      loop
        fetch curTeste into resTeste;
              
              dbms_output.put(resTeste.tar_dt_cadastro);
              dbms_output.put(resTeste.tar_va_nome);
              
      end loop;

end teste_select;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu uso assim , fica mais simples:

 

create or replace procedure teste_select is
begin
      For resTeste in (SELECT  t.tar_dt_cadastro,t.tar_va_nome 
                       FROM orl_tarefas t
                       WHERE t.tar_in_codigo < 10)
      loop
              dbms_output.put(resTeste.tar_dt_cadastro);
              dbms_output.put(resTeste.tar_va_nome);
      end loop;
end teste_select;

Veja o manual para o uso do Cursor , faltou andar com o Cursor;

Compartilhar este post


Link para o post
Compartilhar em outros sites

e aí rapaiz,

particularmente prefiro trabalhar com FOR do que CURSOR.

Exemplo:

 

create or replace procedure teste_select is

begin

for c_cursor in (SELECT t.tar_dt_cadastro,t.tar_va_nome FROM orl_tarefas t WHERE t.tar_in_codigo < 10) loop

dbms_output.put(c_cursor.tar_dt_cadastro);

dbms_output.put(c_cursor.tar_va_nome);

end loop;

 

end teste_select;

 

 

Desta forma, para cada linha retornada no select ele trará as informações.

Qualquer dúvida diz aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e aí rapaiz,

particularmente prefiro trabalhar com FOR do que CURSOR.

Exemplo:

 

create or replace procedure teste_select is

begin

for c_cursor in (SELECT t.tar_dt_cadastro,t.tar_va_nome FROM orl_tarefas t WHERE t.tar_in_codigo < 10) loop

dbms_output.put(c_cursor.tar_dt_cadastro);

dbms_output.put(c_cursor.tar_va_nome);

end loop;

 

end teste_select;

 

 

Desta forma, para cada linha retornada no select ele trará as informações.

Qualquer dúvida diz aí.

 

:( Bom coloquei exatamente o que vocês falarão mas, na hora que eu vou executar na minha WEB APPLICATION ele não traz nada na GRIDVIEW. A procedure não traz nada na SQL e nem na OutPut. Mas na hora que executo a procedure ele executa com sucesso. Como que faço para resgatar os valores. Tirei um PRINT SCREEN das telas.

 

Janela do OUTPUT

Imagem Postada

 

Janela do SQL

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando você rodou no Sql Window, a procedure foi criada. Agora você precisa executá-la na sua aplicação.

Em qual linguagem está desenvolvendo?

 

Sim ele cria quando rodo no Sql Window.Fiz um teste agora apareceu na janela do OUTPUT. Mas mesmo assim não aperece na aplicação. Pois eu desenvolvo em ASP.NET (C#) e jogo num 'OracleDataAdapter' dentro de uma tabela e fazo um DataSource e DataBind numa grid mas não aperece resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hmmm aí vou ficar te devendo, não sei nada de ASP.NET (C#).

Talvez o select tenha que ficar na sua aplicação, deve ter algo na aplicação que faça loops, sei lá...

 

Não dá para você capturar linhas retornadas através de DBMS.OUTPUT no C#, tem que ser ou um SELECT ou um CURSOR inteiro, segundo o Motta me explicou outro dia só da pra fazer isso com Procedure e Package.

 

Também estou com esse problema e ainda não tive tempo de estudar melhor o caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em geral as linguagens de FrontEnd tem já Classes para acesso a BD.

 

Não conheço o C# mas creio que existam Classes para Acesso, Query, StoredProcedures etc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em geral as linguagens de FrontEnd tem já Classes para acesso a BD.

 

Não conheço o C# mas creio que existam Classes para Acesso, Query, StoredProcedures etc.

 

O problema é que já estou utilizando a o metodo que digo que é uma procedure.

 

METODO

[cod]

public void testeGridProcedure()

{

OracleConnection conexao;

OracleCommand comando;

OracleDataAdapter adap;

 

try

{

conexao = objBanco.ConnectaBanco();

conexao.Open();

 

comando = new OracleCommand("teste_select", conexao);

comando.CommandType = CommandType.StoredProcedure; // -> Digo que é para usar como procedure

 

adap = new OracleDataAdapter(comando);

 

DataTable tabela = new DataTable();

 

adap.Fill(tabela);

 

this.ASPxGridView1.DataSource = tabela; //Preenchendo componente com o resutlado do banco

this.ASPxGridView1.DataBind(); //Amarando resultado ao componente

 

}

catch(Exception ex)

{

throw ex;

}

}

 

 

[/cod]

 

Ele executa tudo certo, não da neium erro mas não traz valores. Mas quando executo no PL ele traz valores apenas no OUTPUT.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Stored Procedure não retormam cursores (até podem mas isto é outro assunto).

 

Elas são feitas para processeram no Servidor e BD.

 

Acho que no caso você quer exibir um resultado de uma query, não ?

 

Não seria o caso de se usar um object query ?

 

Não sei se entendi bem a questão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Em geral as linguagens de FrontEnd tem já Classes para acesso a BD.

 

Não conheço o C# mas creio que existam Classes para Acesso, Query, StoredProcedures etc.

 

O problema é que já estou utilizando a o metodo que digo que é uma procedure.

 

METODO

[cod]

public void testeGridProcedure()

{

OracleConnection conexao;

OracleCommand comando;

OracleDataAdapter adap;

 

try

{

conexao = objBanco.ConnectaBanco();

conexao.Open();

 

comando = new OracleCommand("teste_select", conexao);

comando.CommandType = CommandType.StoredProcedure; // -> Digo que é para usar como procedure

 

adap = new OracleDataAdapter(comando);

 

DataTable tabela = new DataTable();

 

adap.Fill(tabela);

 

this.ASPxGridView1.DataSource = tabela; //Preenchendo componente com o resutlado do banco

this.ASPxGridView1.DataBind(); //Amarando resultado ao componente

 

}

catch(Exception ex)

{

throw ex;

}

}

 

 

[/cod]

 

Ele executa tudo certo, não da neium erro mas não traz valores. Mas quando executo no PL ele traz valores apenas no OUTPUT.

 

JhonyMega, se o seu problema for só alterar o CommandType de Procedure pra Query é só fazer isso:

 

Muda essa parte

comando = new OracleCommand("teste_select", conexao);
comando.CommandType = CommandType.StoredProcedure; 

Coloca assim

string strSQL = "SELECT  t.tar_dt_cadastro,t.tar_va_nome FROM orl_tarefas t WHERE t.tar_in_codigo < 10"
comando = new OracleCommand(strSQL, conexao);
comando.CommandType = CommandType.Text; 

O restante você pode manter igual.

 

Agora se quiser encapsular suas queries como com procedures para proteger a integridade do seu banco você pode também criar uma camada de Dados e aplicar todas suas queries lá e só chamar o método retornando um DataSet por exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Em geral as linguagens de FrontEnd tem já Classes para acesso a BD.

 

Não conheço o C# mas creio que existam Classes para Acesso, Query, StoredProcedures etc.

 

O problema é que já estou utilizando a o metodo que digo que é uma procedure.

 

METODO

[cod]

public void testeGridProcedure()

{

OracleConnection conexao;

OracleCommand comando;

OracleDataAdapter adap;

 

try

{

conexao = objBanco.ConnectaBanco();

conexao.Open();

 

comando = new OracleCommand("teste_select", conexao);

comando.CommandType = CommandType.StoredProcedure; // -> Digo que é para usar como procedure

 

adap = new OracleDataAdapter(comando);

 

DataTable tabela = new DataTable();

 

adap.Fill(tabela);

 

this.ASPxGridView1.DataSource = tabela; //Preenchendo componente com o resutlado do banco

this.ASPxGridView1.DataBind(); //Amarando resultado ao componente

 

}

catch(Exception ex)

{

throw ex;

}

}

 

 

[/cod]

 

Ele executa tudo certo, não da neium erro mas não traz valores. Mas quando executo no PL ele traz valores apenas no OUTPUT.

 

JhonyMega, se o seu problema for só alterar o CommandType de Procedure pra Query é só fazer isso:

 

Muda essa parte

comando = new OracleCommand("teste_select", conexao);
comando.CommandType = CommandType.StoredProcedure; 

Coloca assim

string strSQL = "SELECT  t.tar_dt_cadastro,t.tar_va_nome FROM orl_tarefas t WHERE t.tar_in_codigo < 10"
comando = new OracleCommand(strSQL, conexao);
comando.CommandType = CommandType.Text; 

O restante você pode manter igual.

 

Agora se quiser encapsular suas queries como com procedures para proteger a integridade do seu banco você pode também criar uma camada de Dados e aplicar todas suas queries lá e só chamar o método retornando um DataSet por exemplo.

 

O problema não exatamente este. É que eu sempre lidei com procedures mas apenas em SQL SERVER (MSSQL). Eu faço uma boa parte do código no banco de dados. Mas um simples SELECT ta me dando a maior dor de cabeça para fazer, pois agora to trabalhando numa empresa que usa ORACLE por isso que preciso saber como resgatar o valor de um select de uma procedure.

Compartilhar este post


Link para o post
Compartilhar em outros sites

JhonyMega,

 

Dá uma olhada nesse artigo, ele usa as Procedures dentro das Package retornando o cursor e pelo que vi só funciona assim, eu testei aqui e funcionou:

 

http://support.microsoft.com/kb/310101

 

Mas só funcionou com o namespace

System.Data.OleDb;

Aqui na empresa eu uso o

Oracle.DataAccess.Client;
Aí já não rolou :(

 

 

Essa falta de compatibilidade entre Oracle e Miscrosoft me mata...

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.