2015-12-25 3 views
0

Привет У меня есть следующая процедура:Oracle Динамические ВЕЬЕТЕ с DECODE Функция

create or replace procedure 
SP_DELETE_FROM_TABLE(pTableName in VARCHAR2, pFieldName in VARCHAR2, 
        pFieldValue in VARCHAR2,pFieldType in VARCHAR2) is 

    querystring VARCHAR2(500); 
begin 
    queryString := 'DELETE FROM ' ||pTableName|| 
       ' WHERE '||pFieldName ||' = DECODE(:pFieldType,integer,:pFieldValue)' ; 


EXECUTE IMMEDIATE queryString USING pFieldType,pFieldValue; 

end SP_DELETE_FROM_TABLE; 

все мои параметры имеют тип VARCHAR2, что я пытаюсь сделать, это: Когда я вызываю процедуру со следующими значениями ('users_table', 'users_id', '11', 'целое')

так, используя DECODE Я хотел бы проверить, если pFieldValue имеет тип pFieldTypeand если да вернуться pFieldValue

так что если pFieldValue это: 11 и pfieldType: integer, он должен удалить users_id 11, если fieldType - строка ничего не делать ..

ответ

1

Я бы создать функцию, которая проверяет параметр имеет правильный тип , а затем использовать его в основной процедуре

--main procedure 
create or replace procedure SP_DELETE_FROM_TABLE(pTableName in VARCHAR2, pFieldName in VARCHAR2,pFieldValue in VARCHAR2,pFieldType in VARCHAR2) is 

querystring VARCHAR2(500); 
begin 

if 'Y' = is_type_correct(pFieldValue, pFieldType) then  
    queryString := 'DELETE FROM ' ||pTableName|| ' WHERE ' 
     ||pFieldName ||' = :pFieldValue'; 

EXECUTE IMMEDIATE queryString USING pFieldValue; 
end 
else 
    null; --incorrect type and parameter, do nothing 
end; 

end SP_DELETE_FROM_TABLE; 

--check function 
CREATE OR REPLACE FUNCTION is_type_correct(p_val IN VARCHAR2, p_type varchar2) 
    RETURN VARCHAR2 DETERMINISTIC PARALLEL_ENABLE 
IS 
    l_num NUMBER; 
    l_date date; 
BEGIN 
    if 'integer' = p_type 
    then 
    l_num := to_number(p_val); 
    elsif 'date' = p_type then 
    l_date := to_date(p_val, 'YYYY.MM.DD'); 
    elsif 'varchar2' then 
    null;//do nothing 
    else 
    return 'N'; //uknown type 
    end if; 

    RETURN 'Y'; 
EXCEPTION 
    WHEN value_error THEN 
    RETURN 'N'; 
END is_number; 
+0

Я пришел с этим-> queryString: = 'УДАЛИТЬ ИЗ' || pTableName || 'WHERE' || pFieldName || '= DECODE (: pFieldType, ' 'n' ', to_number (: pFieldV1), ' 'c' ', to_char (: pFieldV2) )'; Но когда я добавляю to_date, это не работает. Есть ли какое-либо исправление для этого? – Licentia

+0

отсутствует 'then' после' elsif' – are

0

Просто попробуйте преобразовать строку в число, и при возникновении исключения , ничего не делать:

 querystring VARCHAR2(500); 
    some_number number; 
begin 
    some_number := to_number(pFieldValue); /* trying to convert to a number */ 
    queryString := 'DELETE FROM ' ||pTableName|| 
        ' WHERE '||pFieldName ||' = :x' ; 


    EXECUTE IMMEDIATE queryString USING some_number; 
EXCEPTION 
    WHEN VALUE_ERROR THEN null; /* do nothing when pFieldValue is not a number*/ 
end SP_DELETE_FROM_TABLE;