2009-08-30 13 views
0

この問題の修正を見つけるのに数時間を費やしましたが、ここで質問することにしました。プロシージャ内のROWIDで選択するときに問題が発生する

ローの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; 

上記の行はそのまま動作しません。

insert into values() 

を私は変数row_idを排除し、このようなクエリで直接それを置けば、それは動作します::私はConsultaの内容を印刷するとき、それは示して

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) 

これは作業関連ではないため、パフォーマンス/セキュリティには関係ありません。ご意見ありがとうございます。

+0

あなたはrowid =:row_idを入れてみることができますか? –

+0

ええ、私は試してみましたが、それは私にエラーを与えます:(理由は:アウト変数 –

答えて

0

あなたがこのの実行計画を取得することができます:

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; 

あなたの質問を出力に更新すると、それはさらなる手がかりを与えるかもしれません。

0

なぜDUALから選択していますか?あなたはこれがあなたのために働くべきあなたの簡素化に重要な何かを省略していない限り:

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; 
/
1

あなたはCHARTOROWID()変換関数を使用する必要があります:

row_id := CHARTOROWID('AAAEC5AAFAAAADHAAC'); 

oracle docによると、これは希望urowidデータ型には必要ありません。

関連する問題