2016-12-11 2 views
0

EDIT: Похоже, что это отсортировано, подумайте, что это была проблема с моими табличными вставками.PL/SQL Block Function & Test

Хорошо, поэтому я довольно новичок в PL/SQL, поэтому будьте легко на меня, но у меня есть этот код, который я должен написать, где я должен проверить категорию книги, и если она вернется, у меня будет тест, который будет вставьте строку. Может ли кто-нибудь сказать мне, что в этом плохого? Благодарю. Функция выполняется правильно, но я не совсем уверен, что она верна в ее синтаксисе, и это просто тест, который дает мне ошибку.

CREATE OR REPLACE FUNCTION CheckBookType (
    p_Type titles.category%TYPE) 
    RETURN BOOLEAN IS 

    v_ReturnValue  BOOLEAN; 
BEGIN 

    IF (p_Type) = 'business' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'psychology' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'mod_cook' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'trad_cook' THEN 
    v_ReturnValue := TRUE; 
    ELSIF (p_Type) = 'popular_comp' THEN 
    v_ReturnValue := TRUE; 
    ELSE 
    v_ReturnValue := FALSE; 
    END IF; 

    RETURN v_ReturnValue; 
END CheckBookType; 

set serveroutput on; 
BEGIN 
    IF(CheckBookType('psychology'))=true THEN 
    INSERT INTO Titles VALUES(1234, 'test', 'psychology', sysdate, 1234); 
    ELSE 
    dbms_output.put_line('Invalid'); 
    END IF; 
END; 

ответ

0

Я вижу, вы уже решили это, и это хорошо. Но вот еще одно предложение для вашего заявления IF. Если установка v_ReturnValue ИСТИНА это все, что вы делаете в операторе IF, то вы можете значительно сократить его следующим образом:

v_ReturnValue := FALSE; -- Or better yet, initialize it to FALSE in the declaration 
IF p_Type IN ('business', 'psychology', 'mod_cook', 'trad_cook', 'popular_comp') THEN 
    v_ReturnValue := TRUE; 
END IF; 

Недостатком этого является, если в какой-то момент вам нужно сделать больше, чем просто набор v_ReturnValue для TRUE только для некоторых из значений p_Type, вам нужно снова развернуть оператор IF. С другой стороны, это намного короче, и проще добавлять или удалять значения p_Type, для которых вы хотите, чтобы v_ReturnValue был ИСТИНА.

0

Это выглядит хорошо для меня на первый взгляд. Однако, я предложил бы использовать саз вместо множества IF-THEN-ELSE утверждение:

CASE p_Type 
    WHEN 'business' THEN v_ReturnValue := TRUE; 
    WHEN 'psychology' THEN v_ReturnValue := TRUE; 
    WHEN 'mod_cook' THEN v_ReturnValue := TRUE; 
    WHEN 'trad_cook' THEN v_ReturnValue := TRUE; 
    WHEN 'popular_comp' THEN v_ReturnValue := TRUE; 
    ELSE v_ReturnValue := FALSE; 
END CASE 

я написал о CASE statement before, который может быть использован как в SQL и PL/SQL.

+0

Да, похоже, все в порядке, мне просто нужно было разобраться со столами и поблагодарить, что они кажутся гораздо меньшими усилиями, чем постоянное письмо IF. – Annihil8

+0

Отлично, рад, что вы это решили! – bbrumm