2012-06-15 3 views
1

У меня есть ниже хранимая процедура:Как получить данные из хранимой процедуры?

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 

) 
    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 ='LOADING') 
    THEN 
    BEGIN 

    UPDATE UTILITIES_LOG SET schema_name=p_schema_name, 
    publication_path= p_publication_path, 
    schema_tcm_id= p_schema_tcm_id, 
    component_tcm_id= p_component_tcm_id, 
    component_name= p_component_name, 
    loading_status= p_loading_status, 
    loading_error= p_loading_error, 
    loading_datetime= current_timestamp 
    WHERE 
    r_object_id= p_r_object_id; 

    END; 
    END IF; 


    IF(p_utility_name ='PRE-TRANSFORMATION') 
    THEN 
    BEGIN 
    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; 


    END; 
    END IF; 


    IF(p_utility_name ='TRANSFORMATION') 
    THEN 
    BEGIN 
    UPDATE UTILITIES_LOG SET 
    transformed_file_path= p_transformed_file_path, 
    transformed_status= p_transformed_status, 
    transform_error= p_transform_error, 
    transform_datetime= current_timestamp 
    WHERE 
    exported_file_path= p_exported_file_path; 

    END; 
    END IF; 

    IF(p_utility_name ='RETRIEVE') 
    THEN 
    BEGIN 
    execute immediate 'create global temporary table temp_import as SELECT transformed_file_path,publication_path 
    FROM utilities_log 
    WHERE 
    platform_name= p_platform_name'; 

    END; 
    END IF; 

    IF(p_utility_name ='IMPORTER') 
    THEN 
    BEGIN 
    UPDATE UTILITIES_LOG SET 
    import_status=p_import_status, 
    import_error=p_import_error, 
    import_datetime=current_timestamp 
    WHERE 
    publication_path= p_publication_path; 
    END; 
    END IF; 


    END; 

Я получаю сообщение об ошибке «В» пункта отсутствует в заявлении выберите ... Любая помощь? Благодаря

ответ

1

Правильный способ сделать это (возвращает набор результатов запроса из зра в C#), является использованием типа Ref Cursor, предоставленный оракулом. Вы можете увидеть, как его реализовать here и here

EDIT:
Он должен выглядеть следующим образом (я не имею оракула, но вы можете легко проверить это):

create or replace PROCEDURE "SP_UTILITIES_LOG" ( 
p_utility_name IN varchar2, 
p_r_object_id IN varchar2, 
/* your other parameters */ 
p_refcur out sys_refcursor /* notice the out parameter */ 
) 
AS 
BEGIN 
/* one sample from your select*/ 
IF(p_utility_name ='PRE-TRANSFORMATION') 
THEN  
BEGIN  
     OPERN 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;  
END;  
END IF; 
END; 
+0

благодарит Yavgeny за предложение .... Я понял, что ... я никогда не реализовывал это, поэтому его немного сложно понять с первого взгляда ... Это будет очень полезно, если вы сможете изменить код ... . Спасибо – Aquarius24

+0

Спасибо большое YavgenyP – Aquarius24

1
IF(p_utility_name ='RETRIEVE') THEN 
BEGIN 
    execute immediate 'create global temporary table temp_import 
    as SELECT transformed_file_path,publication_path  
    INTO temp_import 
    FROM utilities_log  
    WHERE platform_name= p_platform_name' 
END  
END IF 

Я думаю

+1

Нет; CTAS ('create table as select') не нуждается в' in'. И временные таблицы не должны создаваться «на лету» в Oracle, но это ошибка OP, а не ваша * 8-) –

+1

Черт не видел тег orackle. –

1

Сообщение об ошибке к этому относится:

IF(p_utility_name ='PRE-TRANSFORMATION') 
THEN 
BEGIN 
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; 
END; 
END IF; 

в/блок PL SQL, данные должны быть выбраны в чем-то, так что вы должны были бы объявить некоторые переменные, а затем сделать:

SELECT exported_file_path,component_tcm_id 
INTO <local_exported_file_path_var>, <local_component_tcm_id_var> 
FROM utilities_log 
... 

Вы можете затем использовать эти переменные в другом месте в СП, который не кажется, есть необходимость в данный момент, так что не уверен, почему вы выбираете вообще. Или у вас есть параметры OUT, которые вы могли бы выбрать, чтобы они могли получить доступ к вызывающему, но вы тоже этого не делаете.

Временные таблицы не должны создаваться «на лету» в Oracle, поэтому вся концепция кажется запутанной. Если вы пытаетесь вернуть таблицу данных вызывающему абоненту, то, как говорит @YavgenyP, просмотрите рефлекторные курсоры. Не уверен, что вы пытаетесь это сделать.

Смежные вопросы