Проблема при выборе ROWID внутри процедуры - PullRequest
0 голосов
/ 31 августа 2009

Я часами пытался найти решение этой проблемы, но так как я не могу найти, я решил спросить здесь.

Я выполняю процедуру для извлечения информации из таблицы на основе строки ROWID, и с результатами я делаю некоторый пользовательский запрос, используя execute immediate. Я сократил проблему до следующих строк, которые выполняю непосредственно в SQL Developer:

declare
  row_id   ROWID;
  consulta VARCHAR2(1000);
begin  
  row_id := 'AAAEC5AAFAAAADHAAC';
  select 'insert into ' || 
    (select TABLA       from BITACORA where rowid = row_id) || ' values(' || 
    (select VALOR_VIEJO from BITACORA where rowid = row_id) || ')' 
    into Consulta from dual;
    DBMS_OUTPUT.PUT_LINE(Consulta);
    --execute immediate Consulta;        
end;

Предыдущие строки не работают как есть. Когда я печатаю содержимое Consulta, оно показывает:

insert into  values()

но если я исключу переменную row_id и введу ее непосредственно в такие запросы, это сработает:

declare
  consulta VARCHAR2(1000);
begin  
  select 'insert into ' || 
    (select TABLA       from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC') || ' values(' || 
    (select VALOR_VIEJO from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC') || ')' 
    into Consulta from dual;
    DBMS_OUTPUT.PUT_LINE(Consulta);
    --execute immediate Consulta;        
end;

Отображение того, что я ожидал, что-то вроде:

insert into MI_TABLA values(1,'Hola','Adios',3,1)

Это не связано с работой, поэтому нет проблем с производительностью / безопасностью. Спасибо за любой отзыв.

Ответы [ 3 ]

1 голос
/ 31 августа 2009

Возможно, вам придется использовать функцию преобразования CHARTOROWID ():

row_id := CHARTOROWID('AAAEC5AAFAAAADHAAC');

Согласно oracle doc , это не будет необходимо для типа данных urowid.

0 голосов
/ 31 августа 2009

Почему вы выбираете из ДВОЙНОГО? Если вы не пропустили что-то важное в своем упрощении, это должно сработать для вас:

declare
  row_id   ROWID;
  consulta VARCHAR2(1000);
begin  
  row_id := 'AAAEC5AAFAAAADHAAC';
  select 'insert into ' ||TABLA || ' values(' ||VALOR_VIEJO|| ')' 
  into   Consulta
  where rowid = row_id; 
  DBMS_OUTPUT.PUT_LINE(Consulta);
  execute immediate Consulta;        
end;
/ 
0 голосов
/ 31 августа 2009

Можете ли вы получить план объяснения этого:

select TABLA       from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC';

и это:

select TABLA       from BITACORA where rowid = :1;

Это зависит от того, на какой версии Oracle вы работаете, но попробуйте это:

explain plan for
select TABLA       from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC';

select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial'));

delete from plan table;

А потом вот это:

explain plan for
select TABLA       from BITACORA where rowid = :1;

select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial'));

delete from plan table;

Обновите ваш вопрос выводом, и это может дать некоторые дополнительные подсказки.

...