Чтение логического файла Oracle dbms_utility.is_cluster_database в инструкции

Я хотел бы прочитать поле boolean из базы данных Oracle (11g), но не могу этого сделать, вероятно, из-за того, что Oracle не полностью поддерживает логический формат данных.

Меня интересует поле dbms_utility.is_cluster_database.

Рабочее заявление:

set serveroutput on;
BEGIN
  IF dbms_utility.is_cluster_database THEN
      dbms_output.put_line('true');
  ELSE
      dbms_output.put_line('false');
  END IF;
END;

Этот оператор работает нормально, однако мне он нужен как SQL-запрос, например SELECT 'someValue' from dual;

Я пробовал:

  1. SELECT dbms_utility.is_cluster_database FROM DUAL; завершается с ошибкой с сообщением "ORA-06553: PLS-382: выражение имеет неверный тип"
  2. SELECT CAST(dbms_utility.is_cluster_database AS INT) FROM DUAL; не работает с тем же сообщением
  3. SELECT sys.diutil.bool_to_int(dbms_utility.is_cluster_database) from DUAL; не работает с тем же сообщением
  4. SELECT CASE WHEN (dbms_utility.is_cluster_database) THEN 1 ELSE 0 END AS MY_BOOLEAN_COLUMN FROM DUAL; завершается ошибкой с сообщением "Ошибка SQL: ORA-00920: недопустимый реляционный оператор"

У меня нет идей, как это можно исправить.

Проблема определенно не связана с правами доступа к базе данных (поскольку решение "dbms_output" работает). Кроме того, другие поля из dbms_utility можно прочитать с помощью простого SELECT dbms_utility.<something> from dual;, например. SELECT dbms_utility.get_endianness FROM DUAL;


person Greg Witczak    schedule 03.03.2016    source источник
comment
Можете ли вы создать функцию, которая вызывает эту функцию и возвращает тип данных, доступный в SQL? Можете ли вы использовать другой подход (например, выполнить count(*) против v$instance, чтобы увидеть, есть ли несколько экземпляров)?   -  person Justin Cave    schedule 03.03.2016
comment
@JustinCave Я не могу создать именованную функцию в этой базе данных   -  person Greg Witczak    schedule 07.03.2016


Ответы (2)


я предполагаю, что невозможно прочитать логические значения в SQL, но вы можете написать функцию-оболочку, которая будет анализировать это логическое значение и возвращать varchar2/int/number.

в качестве альтернативы, в вашем конкретном случае вы можете сделать:

select value from v$parameter where name='cluster_database';
person MaxU    schedule 03.03.2016
comment
Не гадайте, это действительно невозможно. Тип данных boolean не существует в контексте Oracle SQL. - person peter.hrasko.sk; 04.03.2016
comment
@MaxU спасибо, альтернативное решение, которое вы написали, идеально подходит для меня! :) - person Greg Witczak; 07.03.2016

Как предлагает @MaxU, вы можете создать функцию-оболочку.

create or replace function is_cluster_database return number is
begin
  return sys.diutil.bool_to_int(dbms_utility.is_cluster_database);
end is_cluster_database;

А потом использовал это так

select is_cluster_database from dual;

Конечно, результат будет типа число.

is_cluster_database

0
person Stepan Kasyanenko    schedule 04.03.2016
comment
Это работает, но альтернативное решение, предложенное @MaxU, в этом случае намного проще :) - person Greg Witczak; 07.03.2016