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
  

Mensagemem Qua, 24 Mai 2006 11:19 am

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?
rafaelrneto
Localização: São Luís - MA

Mensagemem Qua, 24 Mai 2006 11:25 am

O que você realmente pretende fazer com a consulta dinâmica e essa variável do tipo varchar? :?:
MuLtAnI
Localização: Videira - SC


Mensagemem Qua, 24 Mai 2006 11:40 am

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.

Código: Selecionar todos
/*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.

Código: Selecionar todos
            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:


Código: Selecionar todos
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?
rafaelrneto
Localização: São Luís - MA



Voltar para PL/SQL

Quem está online

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