PL / SQL: тестирование функций, возвращающих логическое значение - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь проверить функцию PL / SQL, которая возвращает логическое значение.Когда я пытаюсь сделать это, используя код ниже, я получаю сообщение об ошибке:

ORA-06550: Выражение неправильного типа.

declare   
 v1 boolean; 
begin 
   select plsql_package.plsql_function('arg1', 'arg2') into v1 from dual;
   dbms_output.put_line('result = ' || v1);
end; 

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

В вашем коде есть две ошибки:

  1. Тип данных BOOLEAN является типом данных PL / SQL и не существует в области действия SQL, поэтому

    CREATE FUNCTION test_fn RETURN BOOLEAN IS BEGIN RETURN FALSE; END;
    /
    
    declare   
      v1 boolean; 
    begin 
      select test_fn() into v1 from dual;
    end;
    /
    

    потерпит неудачу с

    ORA-06550: line 4, column 25:
    PLS-00382: expression is of wrong type
    

    , потому что вы вызываете функцию, возвращающую тип данных только PL / SQL, используя SQL.

    Вместо этого просто присвойте результат функции переменной безиспользуя SQL:

    declare   
      v1 boolean; 
    begin 
      v1 := test_fn();
    end;
    /
    
  2. Оператор объединения строк || и DBMS_OUTPUT.PUT_LINE не принимают аргумент BOOLEAN.

    BEGIN
      DBMS_OUTPUT.PUT_LINE( FALSE );
    END;
    /
    

    завершится с:

    ORA-06550: line 2, column 3
    PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
    

    и

    DECLARE
      v2 VARCHAR2(20);
    BEGIN
      v2 := 'result = ' || FALSE;
    END;
    /
    

    завершится с:

    ORA-06550: line 4, column 9
    PLS-00306: wrong number or types of arguments in call to '||'
    

    Вместо этого вам необходимо преобразовать тип данных BOOLEAN во что-нибудьпринимает как VARCHAR2 / CHAR:

    DECLARE
      v1 BOOLEAN := FALSE;
    BEGIN
      DBMS_OUTPUT.PUT_LINE( 'result = ' || CASE WHEN v1 THEN 'true' ELSE 'false' END );
    END;
    /
    
0 голосов
/ 20 сентября 2018

Так работать не будет;DBMS_OUTPUT.PUT_LINE ожидает строки , а не логический тип данных, поэтому вы должны "преобразовать" значение переменной логического типа в строку - например, используя CASE (как я сделал).Посмотрите на этот пример:

SQL> create or replace function plsql_function return boolean as
  2  begin
  3    return false;
  4  end;
  5  /

Function created.

SQL> set serveroutput on
SQL> declare
  2    v1 boolean;
  3  begin
  4    v1 := plsql_function;
  5    dbms_output.put_line('result ' || case when v1 then 'true' else 'false' end);
  6  end;
  7  /
result false

PL/SQL procedure successfully completed.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...