Como transformar um varchar em uma variável

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
rafaelrneto
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 24 Mai 2006 11:12 am
Localização: São Luís - MA

Estou fazendo um Trigger utilizando um sql dinâmico (a pacote DBMS_SQL). Para finalizar o que eu pretendo fazer, preciso descobrir como transformar um varchar em uma variável. No meu sql, como não sei previamente qual o nome da coluna, tenho que fazer com que o Oralce interprete o varchar ':new.' || v_campo como uma variável. Alguma idéia de como fazer isso?
Avatar do usuário
MuLtAnI
Moderador
Moderador
Mensagens: 90
Registrado em: Ter, 01 Jun 2004 9:21 am
Localização: Videira - SC
Contato:

O que você realmente pretende fazer com a consulta dinâmica e essa variável do tipo varchar? :?:
rafaelrneto
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 24 Mai 2006 11:12 am
Localização: São Luís - MA

Estou fazendo um trigger pra realizar um atualização em cascata. Uso dois cursores, um para descobrir que usa a PK e outro pra descobrir o nome das FK.

Selecionar tudo

/*Cursor que recupera todas as tabelas que utilização a chave primária dessa
tabela. Quando a chave primária é atualizadas, todos as tabelas listadas nessa
consulta deverão receber a atualização.*/
CURSOR c_tabelas_atualizadas is
SELECT A.TABLE_NAME, A.constraint_name FROM SYS.user_constraints A
WHERE A.r_constraint_name = 'PK_A';

/*Cursor que recupera o nome das colunas de cada chave estrangeira que utiliza
a chave primária dessa tabela*/
CURSOR c_colunas_atualizadas is
select COLUMN_NAME from user_Cons_Columns a
where a.constraint_name = v_restricao
ORDER BY A.position;
De posse da tabela e dos campos que devo atualizar faço o update usando o pacote DBMS_SQL.

Selecionar tudo

            DBMS_SQL.PARSE (cur_update,
              'UPDATE ' || v_tabela || ' SET ' || v_chave_FK(0) || ' = ' || :new.ID
              || ' WHERE ' || v_chave_FK(0) || ' = ' || :old.ID, DBMS_SQL.NATIVE);
Perceba que eu tive que colocar no UPDATE o comando :new.ID. É justamento isso que eu não quero, pois se eu mudar o valor da minha chave vou ter que alterar essa trigger. Quero fazer isso dinamico.
Para isso, uso o seguinte SQL para descobrir as colunas que fazem parte da chave:

Selecionar tudo

CURSOR c_colunas_chave_primaria is
select COLUMN_NAME from user_Cons_Columns a
where a.constraint_name = 'PK_A'
ORDER BY A.position;
Depois queria fazer a concatenação do ':new' com o resultado desse cursor. Mas aí o Oracle não interpreta o :new.coluna como uma varchar e não como um comando que pegar a coluna da nova linha da tabela.

Deu pra enteder o problema?
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes