Essa foi a resposta que tive noutro forum...
http://dba.ipbhost.com/index.php?showtopic=3123
talvez realmente não seja possivel com o bind array


On 12/7/05, Marcelo Cauduro <[EMAIL PROTECTED]> wrote:
>
>  Pessoal, para quem ficou interessado na questão...
> O meu objetivo era o seguinte, retornar um array de uma procedure...
>  num parametro out da procedure... entretanto essa seria chamada
> dinamicamento....
> Bem... usando o pacote DBMS_SQL eu infelizmente não consegui,contudo usar
> o sql nativo por meio do execute immediate foi bastante facil e
> trouxe resultados positivos...
> a primeira coisa a ser feita é criar um nested table, você pode
> cria-la com o comando
>
> create or replace type ArrayTeste is table of number;
>
> pronto, agora voce deve criar a procedure que sera chamada dinamicamente
> e ira popular o array
>
> create or replace procedure proc (a out ArrayTeste) is
> begin
>   a := ArrayTeste(1);
>   a(1) := 10;
>   a.extend;
>   a(2) := 20;
> end;
>
> agora , a procedure que chamara qualquer procedure dinamicamente e obtera
> como retorno uma nested table
>
> CREATE OR REPLACE PROCEDURE runarray
>    (proc IN VARCHAR2, outval IN OUT ArrayTeste)
> IS
> BEGIN
>    outval := ArrayTeste(3);
>    execute immediate 'begin ' || proc || ' (:a); end;' using out outval;
> end;
>
> agora é só testar:
>
> declare
>   a ArrayTeste;
> begin
>   runarray('proc', a);
>   for i in a.first..a.last loop
>     dbms_output.put_line(a(i));
>   end loop;
> end;
>
> Qualquer dúvida estou a disposição.
>
>
>
>  On 12/6/05, Marcelo Cauduro <[EMAIL PROTECTED]> wrote:
> >
> > Achei uma alternativa 
> > http://asktom.oracle.com/pls/ask/f?p=4950:8:9598011493460807310::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:5289101303258
> > ,...
> >
> > mas é interessante mencionar que o fato de não ter funciona
> > bind_variable com varchar é que tem de se especificar o tamanho da variavel
> >
> > bind_variable(cursor,'nome',variavel,tamanho)
> >
> > Tks.
> >
> >
> >  On 12/6/05, Marcelo Cauduro <[EMAIL PROTECTED] > wrote:
> > >
> > > Marcio,
> > >
> > > Agradeço pelo email, mas é o seguinte, sei o que é o erro PLS-00306,
> > > mas não sei o porque ele esta acontecendo em meu teste.
> > >
> > > O que eu quero é simplesmente conseguir chamar um procedure
> > > dinamicamente pelo DBMS_SQL e obter o seu retonro,.... mas ao inves de
> > > retornar uma variavel por meio do BIND_VARIABLE, quero retornar um array.
> > > Entao eu tenho uma procedure:
> > > create or replace procedure proc (a out dbms_sql.number_table) is
> > > begin
> > >   a(1) := 10;
> > >   a(5) := 20;
> > > end;
> > > /
> > > que ira montar um array, dai eu tenho uma outra procedure que chama
> > > dinamicamente qualquer procedure e obtem seu retorno, o problema é que:
> > > quando eu retorno variaveis da certo, mas quando uso array da o erro
> > > mencionado,
> > > por exemplo se eu fizesse a seguinte procedure :
> > > e trocasse de bind_array para bind_variable e trocar tudo para
> > > numero... da certo...
> > > *
> > >
> > > create
> > > **or* *replace* *procedure* proc (a *out* *number*) *is*
> > > *begin*
> > > a := 1;
> > > *end*;
> > > /
> > >
> > > *CREATE* *OR* *REPLACE* *PROCEDURE* runarray
> > > (proc *IN* *VARCHAR2*, outval *IN* *OUT* *number*)
> > > *IS*
> > > cur *INTEGER* := DBMS_SQL.OPEN_CURSOR;
> > > fdbk *INTEGER* ;
> > > mytab *number*;
> > > *BEGIN*
> > > DBMS_SQL.PARSE
> > > (cur, 'BEGIN ' || proc || '(' || ':outparam ); END;',
> > > DBMS_SQL.NATIVE);
> > > DBMS_SQL.bind_variable(cur, 'outparam' , mytab);
> > > fdbk := DBMS_SQL. *EXECUTE* (cur);
> > > DBMS_SQL.VARIABLE_VALUE (cur, 'outparam', mytab);
> > > DBMS_SQL.CLOSE_CURSOR (cur);
> > > outval := mytab;
> > > *end*;
> > >
> > > *declare*
> > > a *VARCHAR2*(20);
> > > *begin*
> > > runarray('proc' , a);
> > > *end*;
> > >
> > > agora se eu usar varchar2.... da outro erro...
> > >
> > >
> > > *
> > >
> > > create
> > > **or* *replace* *procedure* proc (a *out* *varchar2*) *is*
> > > *begin*
> > > a := '1';
> > > *end* ;
> > > /
> > >
> > > *CREATE* *OR* *REPLACE* *PROCEDURE* runarray
> > > (proc *IN* *VARCHAR2*, outval *IN* *OUT* *varchar2*)
> > > *IS*
> > > cur *INTEGER *:= DBMS_SQL.OPEN_CURSOR;
> > > fdbk *INTEGER*;
> > > mytab *varchar2*(100);
> > > *BEGIN*
> > > DBMS_SQL.PARSE
> > > (cur, 'BEGIN ' || proc || '(' || ':outparam ); END;',
> > > DBMS_SQL.NATIVE);
> > > DBMS_SQL.bind_variable(cur, 'outparam', mytab);
> > > fdbk := DBMS_SQL.*EXECUTE* (cur);
> > > DBMS_SQL.VARIABLE_VALUE (cur, 'outparam' , mytab);
> > > DBMS_SQL.CLOSE_CURSOR (cur);
> > > outval := mytab;
> > > *end*;
> > >
> > > *declare*
> > > a *VARCHAR2*( 20);
> > > *begin*
> > > runarray('proc' , a);
> > > *end*;
> > >
> > >
> > >
> > > eu nao consigo fazer um bind de um array ou varchar.....
> > >
> > >
> > >
> > > On 12/6/05, Marcio Portes <[EMAIL PROTECTED] > wrote:
> > > >
> > > > Marcelo,
> > > >
> > > > Quando eu enviei a pergunta qual era o objetivo, eu não dei
> > > > seguimento na thread porque realmente não entendi o que voce está
> > > > tentando fazer. E como o dia-a-dia é corrido, não há tempo
> > > > para "espremer" perguntas que não são claras para mim.
> > > >
> > > > Se voce que saber por que do PLS-00306 é simples - MANUAL.
> > > >
> > > > PLS-00306 wrong number or types of arguments in call to 'string'
> > > >
> > > > Cause: This error occurs when the named subprogram call cannot be
> > > > matched to any declaration for that subprogram name. The subprogram
> > > > name might be misspelled, a parameter might have the wrong datatype,
> > > >
> > > > the declaration might be faulty, or the declaration might be placed
> > > > incorrectly in the block structure. For example, this error occurs
> > > > if
> > > > the built-in square root function SQRT is called with a misspelled
> > > > name or with a parameter of the wrong datatype.
> > > >
> > > > Action: Check the spelling and declaration of the subprogram name.
> > > > Also confirm that its call is correct, its parameters are of the
> > > > right datatype, and, if it is not a built-in function, that its
> > > > declaration is placed correctly in the block structure.
> > > >
> > > > O que acontece é que não entendi a razão de ter montado o teste como
> > > >
> > > > voce fez. Por isso eu deixei a thread. Se quiser retomar, por favor
> > > > seja específico no que está tentando fazer, inclusive com dados/
> > > > create table/ inserts, etc. Para que faça sentido sua dúvida!
> > > >
> > > > Outra coisa, acho que já foi comentado aqui. Lista não é lugar para
> > > > questões urgentes! Urgência deve ser tratada como urgência, ou seja,
> > > >
> > > > escalando o problema para que seja resolvido.
> > > >
> > > > --- Em oracle_br@yahoogrupos.com.br, Marcelo Cauduro <[EMAIL PROTECTED]>
> > > >
> > > > escreveu
> > > > > Alguem ? Estou precisando disso urgente... ja tentei postar em
> > > > outro grupo
> > > > > mas parece que ninguem sabe....
> > > > >
> > > > > On 12/5/05, Marcelo Cauduro <[EMAIL PROTECTED]> wrote:
> > > > > >
> > > > > > Alguem tem alguma idéia ?
> > > > > >
> > > > > > On 12/3/05, Marcelo Cauduro <[EMAIL PROTECTED]> wrote:
> > > > > > >
> > > > > > > Eu tenho uma procedure que dá o mesmo erro que essa, mas não
> > > > sei o por
> > > > > > > quê,
> > > > > > >
> > > > > > > meu objetivo :
> > > > > > >  eu tenho uma procedure que me retorna um array, só que essa
> > > > procedure
> > > > > > > eh executada dinamicamente.... e ela pode retornar um array
> > > > com
> > > > 1 ou mais
> > > > > > > valores, quando dou o dbms_sql.bind_array passa, mas qndo dou
> > > > o
> > > > campo para
> > > > > > > executar o sql da erro
> > > > > > >
> > > > > > > a primeira procedure acima
> > > > > > >
> > > > > > > create or replace procedure proc (a out dbms_sql.number_table)
> > > >
> > > > is
> > > > > > > begin
> > > > > > >   a(1) := 10;
> > > > > > >   a(5) := 20;
> > > > > > > end;
> > > > > > >
> > > > > > > coloca valores num array
> > > > > > >
> > > > > > > a segunda
> > > > > > > CREATE OR REPLACE PROCEDURE runarray
> > > > > > >    (proc IN VARCHAR2, outval IN OUT DBMS_SQL.NUMBER_TABLE)
> > > > > > > IS
> > > > > > >    cur INTEGER := DBMS_SQL.OPEN_CURSOR;
> > > > > > >    fdbk INTEGER;
> > > > > > >    mytab DBMS_SQL.NUMBER_TABLE;
> > > > > > > BEGIN
> > > > > > >    DBMS_SQL.PARSE
> > > > > > >      (cur, 'BEGIN ' || proc || '(' || ':outparam ); END;',
> > > > > > >       DBMS_SQL.NATIVE);
> > > > > > >    DBMS_SQL.BIND_ARRAY (cur, 'outparam', mytab);
> > > > > > >    fdbk := DBMS_SQL.EXECUTE (cur);
> > > > > > >    DBMS_SQL.VARIABLE_VALUE (cur, 'outparam', mytab);
> > > > > > >    DBMS_SQL.CLOSE_CURSOR (cur);
> > > > > > >    outval := mytab;
> > > > > > > end;
> > > > > > > /
> > > > > > > de uma procedure consegue obter o retorno dela, mas esse
> > > > retorno pode
> > > > > > > ser um array, ...
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > On 12/3/05, Marcio Portes <[EMAIL PROTECTED] > wrote:
> > > > > > > >
> > > > > > > > Engenharia reversa demora muito! Qual seu objetivo aqui?
> > > > > > > >
> > > > > > > > --- Em oracle_br@yahoogrupos.com.br, "marcelobcauduro"
> > > > > > > > <[EMAIL PROTECTED]> escreveu
> > > > > > > > > Pessoal,
> > > > > > > > >
> > > > > > > > > Eu estou tentando usar o bind array mas estou recebendo o
> > > > erro PLS-
> > > > > > > > > 00306, o código é o abaixo :
> > > > > > > > >
> > > > > > > > > create or replace procedure proc (a out
> > > > dbms_sql.number_table) is
> > > > > > > > > begin
> > > > > > > > >   a(1) := 10;
> > > > > > > > >   a(5) := 20;
> > > > > > > > > end;
> > > > > > > > > /
> > > > > > > > > CREATE OR REPLACE PROCEDURE runarray
> > > > > > > > >    (proc IN VARCHAR2, outval IN OUT DBMS_SQL.NUMBER_TABLE)
> > > >
> > > > > > > > > IS
> > > > > > > > >    cur INTEGER := DBMS_SQL.OPEN_CURSOR;
> > > > > > > > >    fdbk INTEGER;
> > > > > > > > >    mytab DBMS_SQL.NUMBER_TABLE;
> > > > > > > > > BEGIN
> > > > > > > > >    DBMS_SQL.PARSE
> > > > > > > > >      (cur, 'BEGIN ' || proc || '(' || ':outparam ); END;',
> > > > > > > > >       DBMS_SQL.NATIVE);
> > > > > > > > >    DBMS_SQL.BIND_ARRAY (cur, 'outparam', mytab);
> > > > > > > > >    fdbk := DBMS_SQL.EXECUTE (cur);
> > > > > > > > >    DBMS_SQL.VARIABLE_VALUE (cur, 'outparam', mytab);
> > > > > > > > >    DBMS_SQL.CLOSE_CURSOR (cur);
> > > > > > > > >    outval := mytab;
> > > > > > > > > end;
> > > > > > > > > /
> > > > > > > > > declare
> > > > > > > > >   a dbms_sql.number_table;
> > > > > > > > > begin
> > > > > > > > >   runarray('proc', a);
> > > > > > > > > end;
> > > > > > > > > /
> > > > > > > > >
> > > > > > > > > ORA-06550: line 1, column 7:
> > > > > > > > > PLS-00306: wrong number or types of arguments in call
> > > > to 'PROC'
> > > > > > > > > ORA-06550: line 1, column 7:
> > > > > > > > > PL/SQL: Statement ignored
> > > > > > > > >
> > > > > > > > > Alguem sabe o por que ?
> > > > > > > > >
> > > > > > > > > Muito OBrigado.
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > --------------------------------------------------------------
> > > > ------------------------------------------------------------
> > > > > > > > Atenção! As mensagens deste grupo são de acesso público e de
> > > >
> > > > inteira
> > > > > > > > responsabilidade de seus remetentes.
> > > > > > > > Acesse: http://www.mail-
> > > > archive.com/oracle_br@yahoogrupos.com.br/
> > > > > > > >
> > > > --------------------------------------------------------------
> > > > ------------------------------------------------------------
> > > > _____________________________________________________________________
> > > >
> > > > > > > >
> > > > > > > > Area de download do grupo -
> > > > http://www.4shared.com/dir/101727/a4dcc423
> > > > > > > >
> > > > > > > >
> > > > > > > >   *Yahoo! Grupos, um serviço oferecido por:*   PUBLICIDADE
> > > > > > > >
> > > > > > > >
> > > > <http://br.rd.yahoo.com/SIG=12f9pttir/M=365837.7000707.7924794.2369893
> > > >
> > > > /D=brclubs/S=2137114689:HM/Y=BR/EXP=1133637409/A=2950750/R=2/id=noscri
> > > > pt/SIG=10tift5qr/* http://br.movies.yahoo.com/>
> > > > > > > > ------------------------------
> > > > > > > > *Links do Yahoo! Grupos*
> > > > > > > >
> > > > > > > >    - Para visitar o site do seu grupo na web, acesse:
> > > > > > > >    http://br.groups.yahoo.com/group/oracle_br/
> > > > > > > >
> > > > > > > >    - Para sair deste grupo, envie um e-mail para:
> > > > > > > >    [EMAIL PROTECTED]
> > > > > > > >    <[EMAIL PROTECTED] ?
> > > > subject=Unsubscribe>
> > > > > > > >
> > > > > > > >    - O uso que você faz do Yahoo! Grupos está sujeito aos
> > > > Termos do
> > > > > > > >    Serviço do Yahoo! < http://br.yahoo.com/info/utos.html>.
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > > >
> > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > --------------------------------------------------------------------------------------------------------------------------
> > > > Atenção! As mensagens deste grupo são de acesso público e de inteira
> > > > responsabilidade de seus remetentes.
> > > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > > > --------------------------------------------------------------------------------------------------------------------------_____________________________________________________________________
> > > >
> > > > Area de download do grupo -
> > > > http://www.4shared.com/dir/101727/a4dcc423
> > > >
> > > >
> > > >   *Yahoo! Grupos, um serviço oferecido por:*   PUBLICIDADE
> > > >
> > > > <http://br.rd.yahoo.com/SIG=12f819c10/M=384888.7585449.8468440.1588051/D=brclubs/S=2137114689:HM/Y=BR/EXP=1133883825/A=3154524/R=0/SIG=12igfl26t/*http://www.momentumquiz.com.br/index.php?md5ref=372BBEE98E9544bd8B2F9E87847EEEBE>
> > > > ------------------------------
> > > > *Links do Yahoo! Grupos*
> > > >
> > > >    - Para visitar o site do seu grupo na web, acesse:
> > > >    http://br.groups.yahoo.com/group/oracle_br/
> > > >
> > > >    - Para sair deste grupo, envie um e-mail para:
> > > >    [EMAIL PROTECTED]
> > > >    <[EMAIL PROTECTED]>
> > > >
> > > >    - O uso que você faz do Yahoo! Grupos está sujeito aos Termos
> > > >    do Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>.
> > > >
> > > >
> > >
> >
>


[As partes desta mensagem que não continham texto foram removidas]



--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------_____________________________________________________________________
Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423  
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a