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