Colega, imagino que vc tem um punhadinho de tabelas, meia dúzia
talvez, que podem ser passadas, então antes de responder um aviso e
uma recomendação : ****** não ****** use SQL dinâmico, a não ser que
vc queira fazer a sua vida miserável... SQL dinâmico necessariamente
faz um PARSE a cada execução, gasta mais CPU, não é passível de
otimização/re-escrita pelo CBO, é ULTRA complicado para debugar (como
creio que vc já está percebendo, ou vai perceber ao ver os exemplos
que citarei), só se deve usar esse cara em situações RARAS e
RESTRITAS, aonde realmente não dá pra fazer de outra maneira... 100%,
no seu caso eu pensaria SERIAMENTE em escrever meia dúzia de rotinas
fixas similares, OU ter uma aonde vc define meia dúzia de cursores
FIXOS, não-dinâmicos, diferentes e abre um ou outro cfrme o argumento
que for passado....

 Isto posto, SE vc quiser mesmo se arriscar por esse terreno pantanoso
do SQL dinâmico, seguinte : salvo algum trucão muito grande (tipo, uma
rotina que dinamicamente faça um DDL criando outra, ou fazendo um
CREATE TYPE, coisa doida assim) a resposta é não, o %ROWTYPE só
funciona no DECLARE, ele é uma DECLARAÇÃO, então obviamente ** antes
** de executar o PL/SQL, em tempo de COMPILAÇÃO, o objeto que serve de
base TEM QUE ser conhecido, NÃO TEM COMO ser dinâmico em princípio....
Assim, um SQL dinâmico que for trabalhar com quantidade variável de
colunas TEM QUE usar as rotinas do DBMS_SQL :
http://asktom.oracle.com/tkyte/Misc/csv.html é um exemplo : veja lá,
ao invés de definir uma rowtype vc CRIA um array com as colunas, é
isso.... Essa situação é uma aonde realmente o SQL dinãmico cabe : NÃO
é parte do core da aplicação, vai rodar de vez em quando (então os
eventuais probs de performance devem ser toleráveis) e não é possivle
se definir quantas/quais tabelas e colunas podem ser passadas pra
rotina, este é um caso 100% aceitável de SQL dinãmico.

 []s

  Chiappa
--- Em oracle_br@yahoogrupos.com.br, francisco porfirio
<francisco.porfi...@...> escreveu
>
> Pessoal estou construindo uma procedure que de acordo com a tabela
passada
> ele faz as devidas oprações, porém eu preciso utilizar o rowtype
conforme
> abaixo.
> 
> O problema é que eu queria conseguir pegar esse rowtype de acordo com o
> parametro(nome da tabela ) passado na minha procedure.
> Algume pode da uma força ou sabe uma outra solução?
> 
> CREATE OR REPLACE PROCEDURE varre_cursor (
>     nome_tabela VARCHAR2,
>     qtd_linhas  PLS_INTEGER
>     )
> IS
> 
>    retorna_cursor  SYS_REFCURSOR;
>    registro    nome_tabela%ROWTYPE;
> 
>    BEGIN
>       constroi_cursor(nome_tabela, qtd_linhas, retorna_cursor);
> 
>      FOR i IN 1 .. qtd_linhas
>      LOOP
>         FETCH retorna_cursor
>         INTO registro;
> 
>         dbms_output.put_line(registro.codigo);
>      END LOOP;
> END varre_cursor;
> 
> 
> 
> Atenciosamente
> Francisco Porfirio Ribeiro Neto
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a