0

カーソルを使用しているオラクルのストアドプロシージャがあります。C#コードを介して呼び出すと、データが正しくフェッチされます。ただし、テーブルが更新されると、C#アプリケーションでコードを実行した後に古い値も取得されます。更新された値を取得するには、プロシージャを毎回コンパイルする必要があります...何かアイデアはありますか?

ストアドプロシージャのPFBスニペット...

create or replace
PROCEDURE "SP_UTILITIES_LOG"
(
p_utility_name IN varchar2,
p_r_object_id IN varchar2,
p_platform_name IN varchar2,
p_exported_file_path IN varchar2,
p_Is_binary IN number,
p_extraction_status IN varchar2,
p_extraction_error IN varchar2,
p_extraction_datetime IN VARCHAR2,
p_schema_name IN varchar,
p_publication_path IN varchar,
p_schema_tcm_id IN varchar,
p_component_tcm_id IN varchar,
p_component_name IN varchar,
p_loading_status IN varchar,
p_transformed_file_path IN varchar,
p_transformed_status IN varchar,
p_import_status IN varchar,
p_loading_error IN varchar,
p_transform_error IN varchar,
p_import_error IN varchar,
p_loading_datetime IN TIMESTAMP,
p_transform_datetime IN TIMESTAMP,
p_import_datetime IN TIMESTAMP,
p_refcur out sys_refcursor
)
   IS  
   BEGIN

    IF(p_utility_name ='EXTRACTION')
    THEN
    BEGIN
   INSERT INTO utilities_log(R_OBJECT_ID,
PLATFORM_NAME,
EXPORTED_FILE_PATH,
IS_BINARY,
EXTRACTION_STATUS,
EXTRACTION_ERROR,
EXTRACTION_DATETIME
)
   VALUES(p_r_object_id, p_platform_name,p_exported_file_path, p_is_binary, p_extraction_status, p_extraction_error, p_extraction_datetime); 

    END;
    END IF;




    IF(p_utility_name ='PRE-TRANSFORMATION')
    THEN
    BEGIN
    OPEN p_refcur FOR
    SELECT exported_file_path,component_tcm_id FROM utilities_log
    WHERE platform_name= p_platform_name
    AND loading_status=p_loading_status
    AND extraction_status=p_extraction_status
    AND Is_binary=p_Is_binary; 


    END;
    END IF;
4

1 に答える 1

1

デフォルトのトランザクション分離レベル (読み取りコミット) を使用していると仮定すると、カーソルからフェッチされるデータは、カーソルが開かれた瞬間のデータの一貫したビューです。カーソルが開かれた後にコミットされたテーブルへの変更は、アプリケーションが将来カーソルからデータをフェッチするときに返されません。現在のデータを取得する場合は、カーソルを閉じてから再度開く必要があります。

于 2012-06-19T05:07:46.953 に答える