Como carregar uma variavel de forma dinamica

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
JONI
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 31 Jul 2007 10:07 am
Localização: porto alegre - rs

Pessoal, preciso mostrar o conteúdo da variável abaixo, mas não sei como.

A TABELA POSSUI A ESTRUTURA ASSIM

Selecionar tudo

PEDIDO_IMPORT
 POT_DATA_01
 POT_DATA_02
 POT_DATA_03
 ...
 ...

Selecionar tudo

FOR VAR IN BUSCA_PEDIDO_IMPORT LOOP
 FOR VAP IN 1..W_NUM_MESES LOOP
   W_PCC_PRE_ENT := ('VAR.POT_DATA_'||LPAD(VAP,2,0));
   DBMS_OUTPUT.PUT_LINE(W_PCC_PRE_ENT);  ---AQUI TA MOSTRANDO POT_DATA_01, DEVERIA MOSTRAR 01/01/09 QUE É O CONTEÚDO.
  END LOOP;
END LOOP;
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

No seu codigo, você esta inserindo o valor na variavel que está sendo exibido.

Selecionar tudo

 W_PCC_PRE_ENT := ('VAR.POT_DATA_'||LPAD(VAP,2,0)); 
Acredito que você queira fazer isso

Selecionar tudo

 W_PCC_PRE_ENT := VAR.POT_DATA_||LPAD(VAP,2,0); 
Já que VAR.POT_DATA_XX é uma variavel.
JONI
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 31 Jul 2007 10:07 am
Localização: porto alegre - rs

Rodrigo, o problema que eu definir como

Selecionar tudo

VAR.POT_DATA_||LPAD(VAP,2,0);
o Oracle pede que eu defina a variável VAR.POT_DATA_ , e o que eu preciso é exatamente o que você colocou, fazer com que ele entenda que VAR.POT_DATA_XX seja um variável.
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Bom, sua modelagem não ta ajudando muito.. mas vamos lá.

Fiz o seguinte

Selecionar tudo

CREATE TABLE PEDIDO_IMPORT (
POT_DATA_01 DATE, 
POT_DATA_02 DATE, 
POT_DATA_03 DATE);
depois insert de valores

Selecionar tudo

INSERT INTO pedido_import VALUES (SYSDATE-100,SYSDATE - 50, SYSDATE - 10);
agora o script

Selecionar tudo

DECLARE
  CURSOR BUSCA_PEDIDO_IMPORT IS
    SELECT pot_data_01, pot_data_02, pot_data_03
      FROM pedido_import;
    
  vdata DATE;
  W_PCC_PRE_ENT VARCHAR2(2000);
BEGIN
  FOR VAR IN BUSCA_PEDIDO_IMPORT LOOP 
   FOR VAP IN 1..3 LOOP 
     IF VAP = 1 THEN
       W_PCC_PRE_ENT := VAR.POT_DATA_01; 
     ELSIF VAP = 2 THEN
       W_PCC_PRE_ENT := VAR.POT_DATA_02;
     ELSE 
       W_PCC_PRE_ENT := VAR.POT_DATA_03;
     END IF;
     DBMS_OUTPUT.PUT_LINE(W_PCC_PRE_ENT);  ---AQUI está MOSTRANDO POT_DATA_01, DEVERIA MOSTRAR 01/01/09 QUE É O CONTEÚDO. 
    END LOOP; 
  END LOOP;
END;
Porém, acredito que colocando essa tabela em linhas ao invés de colunas e ao lado de cada "pot_data" colocar uma coluna de mês, você teria uma forma melhor de trabalhar...

veja se é isso!

Abraço
RodrigoValentim
Moderador
Moderador
Mensagens: 367
Registrado em: Ter, 25 Mar 2008 3:41 pm
Localização: Salvador - BA
Rodrigo Valentim
Analista de Sistemas
Oracle Developer

Campanha: Faça uma pesquisa antes de perguntar!!!

Esqueci o resultado..

Selecionar tudo

17/01/09
08/03/09
17/04/09
Rique
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Ter, 12 Ago 2008 4:45 pm
Localização: Santa Barbara d'Oeste - SP
Rique

Um outra forma é:

Selecionar tudo

DECLARE
   W_PCC_PRE_ENT VARCHAR2(100);
BEGIN
    FOR VAP IN 1..12 LOOP 
      W_PCC_PRE_ENT := ('POT_DATA_'||LPAD(VAP,2,0)); 
      EXECUTE IMMEDIATE ('DECLARE A VARCHAR2(100); BEGIN  SELECT '||W_PCC_PRE_ENT||' INTO A FROM PEDIDO_IMPORT; DBMS_OUTPUT.PUT_LINE(A); END;');
    END LOOP; 
END;

Abss
JONI
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 31 Jul 2007 10:07 am
Localização: porto alegre - rs

Pessoal, vejam o exemplo abaixo...

Selecionar tudo

create table usuario (codigo number, nome varchar2(10));
insert into usuario values (1, 'joao');
insert into usuario values (2, 'maria');
insert into usuario values (3, 'jose');

create table aplicacao (var_sql varchar2(100), parametros varchar2(100));
insert into aplicacao values ('select nome from usuario where codigo = :codigo','codigo');
insert into aplicacao values ('select codigo from usuario where nome = :nome','nome');

Selecionar tudo

declare
cursor busca is
 select * from aplicacao;
codigo number := 2; --esta variavel já estara no plsql
nome   varchar2(20) := 'maria';  --esta variavel já estara no plsql
retorno varchar2(20);
chave varchar2(20);
begin
for x in busca loop
 chave := var.var_parametro; --aqui preciso que ele carregue 2 em uma leitura e maria na outra
 execute immediate var.var_sql into retorno using chave; --para poder filtrar aqui
 dbms_output.put_line(retorno); --e devolver maria e depois o codigo 2
end loop;
end;
Preciso que o sistema entenda que a chave seja dinamica, isto servira para uma aplicacao bancaria onde o usuario com um minimo de conhecimento em sql conseguira formatar um arquivo .txt.

Pessoal, se não consegui explicar muito bem, eu faco um exemplo mais completo.

Agradeco a quem puder me ajudar... já fiz testes de tudo que foi jeito e não consegui.
JONI
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 31 Jul 2007 10:07 am
Localização: porto alegre - rs

Ops.. um pequeno conserto no script acima

Selecionar tudo

declare
  cursor busca is
  select * from aplicacao;
  codigo number := 2; --esta variavel já estara no plsql -- informada atraves de parametro
  nome varchar2(20) := 'maria'; --esta variavel já estara no plsql -- informada atraves de parametro
  retorno varchar2(20);
  chave varchar2(20);
begin
  for var in busca loop
    chave := var.var_parametro; --aqui preciso que ele carregue 2 em uma leitura e maria na outra
    execute immediate var.var_sql into retorno using chave; --para poder filtrar aqui
    dbms_output.put_line(retorno); --e devolver maria e depois o codigo 2
  end loop;
end;
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Acho que você precisa ter muito cuidado com essa solução, por conta de fragilidade a SQL injection. Abrir o banco de dados para o usuário dessa forma, principalmente com dados sigilosos, pode se tornar um problemão...
JONI
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 31 Jul 2007 10:07 am
Localização: porto alegre - rs

Amigo... quem ira definir não sera um usuario final (entendo sua preocupacao), mas sim um administrador do sistema (não e um desenvolvedor), a propria aplicacao limitara muitas coisas, a logica ficara dentro de um procedimento. Sera que tem como fazer?
JONI
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 31 Jul 2007 10:07 am
Localização: porto alegre - rs

Pessoal, o que quero fazer em oracle e a mesma coisa que esse codigo php abaixo esta fazendo, me ajudem ai......

Selecionar tudo

<?php
$foo = 'Bob'; // Atribui o valor 'Bob' a $foo
$bar = &$foo; // Referência $foo via $bar.
$bar = "O meu nome é $bar"; // Modifica $bar...
echo $foo; // $foo também se modifica.
echo $bar;
?> 
Isto dará como resultado a visualização duas vezes do string "O meu nome é Bob".
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Seria algo assim?

Selecionar tudo

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 
Connected as FSITJA
 
SQL> 
SQL> set serveroutput on
SQL> create table usuario (codigo number, nome varchar2(10));
 
Table created
SQL> insert into usuario values (1, 'joao');
 
1 row inserted
SQL> insert into usuario values (2, 'maria');
 
1 row inserted
SQL> insert into usuario values (3, 'jose');
 
1 row inserted
SQL> create table aplicacao (var_sql varchar2(100), parametros varchar2(100));
 
Table created
SQL> insert into aplicacao values ('select nome from usuario where codigo = :codigo','codigo');
 
1 row inserted
SQL> insert into aplicacao values ('select codigo from usuario where nome = :nome','nome');
 
1 row inserted
SQL> DECLARE
  2    CURSOR busca IS
  3      SELECT var_sql, parametros FROM aplicacao;
  4    codigo  NUMBER := 2; --esta variavel já estara no plsql -- informada atraves de parametro
  5    nome    VARCHAR2(20) := 'maria'; --esta variavel já estara no plsql -- informada atraves de parametro
  6    retorno VARCHAR2(20);
  7    chave   VARCHAR2(20);
  8  BEGIN
  9    FOR var IN busca
 10    LOOP
 11      IF var.parametros = 'codigo'
 12      THEN
 13        chave := codigo;
 14      ELSIF var.parametros = 'nome'
 15      THEN
 16        chave := nome;
 17      END IF;
 18      EXECUTE IMMEDIATE var.var_sql
 19        INTO retorno
 20        USING chave; --para poder filtrar aqui
 21      dbms_output.put_line(retorno); --e devolver maria e depois o codigo 2
 22    END LOOP;
 23  END;
 24  /
 
maria
2
 
PL/SQL procedure successfully completed
JONI
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Ter, 31 Jul 2007 10:07 am
Localização: porto alegre - rs

Sim, o resultado esta correto, mas precisaria que a chave asumisse o conteudo da variavel, igual ao codigo php acima, porque terei uma infinidade de parametros, retirando assim os ifs fora, e deixando trabalhar de forma dinamica.
Responder
  • Informação