Oracle boolean тип данных
This function is a part of 3rd party tool, I cannot change this.
I would like to use this function inside a SELECT statement like this:
This does not work, I get this exception:
As I understand it, keyword TRUE is not recognized.
How can I make this work?
I'm embarrassed on Oracle's behalf that you can't even do a comparison in a SQL statement with a boolean value returned from a PL/SQL block. You can't even wrap such a function in a CASE statement. The only sane answer is to upgrade your database to PostgreSQL, which deals with booleans in SQL statements beautifully.
This is not quite true. Use the built-in sys.diutil.bool_to_int to convert BOOLEAN to INTEGER 0 or 1. Inside a stored procedure, there's no problem using BOOLEAN variables but that's not exactly the issue of concern here.
Символьные типы данных PL/SQL
PL/SQL поддерживает строки как фиксированной, так и переменной длины, представленные как в традиционных кодировках, так и в кодировках Unicode. CHAR и NCHAR - это типы строк фиксированной длины, а VARCHAR2 и NVARCHAR2 - типы строк переменной длины. Рассмотрим объявление строки переменной длины, которая может вмещать до 2000 символов:
Oracle также поддерживает очень длинные символьные строки - типы LONG и LOB . Эти типы данных позволяют хранить и обрабатывать огромные объемы данных: LOB может содержать до 128 терабайт информации в Oracle Database 10g (используйте тип LONG только для совместимости с уже существующим кодом. Будущее за типами LOB!). К символьным типам данных LOB относятся CLOB (character large object - большой символьный объект) и NCLOB (National Language Support character large object - большой символьный объект с поддержкой национальных языков, многобайтный формат).
Числовые типы данных PL/SQL
PL/SQL поддерживает все более широкое множество числовых типов данных. Долгие годы рабочей лошадкой числовых типов данных был тип NUMBER, который можно использовать для десятичных значений с фиксированной и плавающей точкой, а также для целых значений. Приведем несколько примеров объявлений типа NUMBER:
Десятичная природа типа NUMBER оказывается чрезвычайно полезной при работе с денежными величинами. Вам не придется беспокоиться о возможных ошибках округления при переводе числа в двоичное представление. Например, записывая число 0.95, не стоит бояться, что от него через некоторое время останется только 0.949999968.
До выпуска версии Oracle Database 10g тип NUMBER был единственным числовым типом данных PL/SQL, полностью соответствующим типу данных базы данных. Это одна из причин столь широкого использования типа NUMBER. В Oracle Database 10g появилось еще два двоичных типа с плавающей точкой: BINARY_FLOAT и BINARY_DOUBLE. Как и NUMBER, оба новых типа поддерживаются как в PL/SQL, так и в базе данных. Правильно применяя их, можно добиться значительного повышения производительности за счет того, что математические операции над новыми типами выполняются аппаратной частью (когда это позволяет аппаратная платформа).
Язык программирования PL/SQL поддерживает ряд числовых типов и подтипов, которые не соответствуют типам базы данных, но, тем не менее, весьма полезны. Упомянем особо PLS_INTEGER, целочисленный тип, для которого арифметические операции выполняются аппаратно. Счетчики циклов FOR реализованы типом PLS_INTEGER.
Логические типы данных PL/SQL
PL/SQL поддерживает настоящий логический (булев) тип данных. Переменная этого типа может иметь лишь одно из трех значений: TRUE, FALSE и NULL.
Логические переменные позволяют сделать код удобочитаемым, даже в том случае, когда он содержит сложные логические выражения. Рассмотрим пример объявления переменной типа Boolean с присваиванием ей значения по умолчанию:
Двоичные данные PL/SQL
Oracle поддерживает несколько видов двоичных данных (это неструктурированные данные, которые не интерпретируются и не обрабатываются Oracle), в том числе RAW, LONG RAW, BFILE и BLOB. Тип данных BFILE хранит неструктурированные двоичные данные в файлах операционной системы вне базы данных. RAW - это тип данных переменной длины, подобный символьному типу данных VARCHAR2 и отличающийся от него тем, что утилиты Oracle не выполняют преобразования символов при передаче данных типа RAW.
Типы данных для поддержки интернет-технологий
В Oracle9i появилась встроенная поддержка ряда технологий и типов данных, связанных с Интернетом, в частности XML (eXtensible Markup Language) и URI (Universal Resource Identifier). В Oracle имеются специализированные типы для работы с данными XML и URI, а также специальный класс идентификаторов URI ( DBUri-REF ), который используется для доступа к базе данных. Кроме того, в Oracle появился новый набор типов данных, обеспечивающий хранение внешних и внутренних URI и обращение к ним из базы данных.
Тип XMLType предназначен для запроса и сохранения данных в формате XML. Для работы с XML используются такие функции, как SYS_XMLGEN из пакета DBMS_XMLGEN . Поддержка XPath и встроенные команды языка SQL позволяют выполнять поиск данных в документах XML.
Числовые типы данных
В PL/SQL поддерживаются как вещественные, так и целочисленные типы данных. Тип NUMBER давно был основным типом для работы с числовыми данными; он может применяться для работы с целыми и вещественными данными как с фиксированной, так и с плавающей запятой. Пример типичного объявления NUMBER :
Из-за своей внутренней десятичной природы тип NUMBER особенно удобен при работе с денежными суммами. В отличие от двоичного представления, ему не присущи ошибки округления. Например, если сохранить в нем значение 0.95, позднее вы прочитаете именно эту величину, а не приближенную (скажем, 0.949999968).
До выхода Oracle10g тип NUMBER был единственным числовым типом данных PL/SQL, напрямую соответствовавшим типу столбцов базы данных. В этом нетрудно убедиться, изучив содержимое пакета STANDARD . Данная особенность стала одной из причин, по которым тип NUMBER так широко применялся в программах PL/SQL.
В Oracle10g появились два двоичных типа с плавающей запятой: BINARY_FLOAT и BINARY_DOUBLE . Как и NUMBER , эти двоичные типы данных поддерживаются и в PL/SQL, и в базах данных. Однако в отличие от NUMBER , эти типы хранят значение в двоичном виде, а следовательно, при работе с ними могут возникнуть погрешности округления. Типы BINARY_FLOAT и BINARY_DOUBLE поддерживают специальные значения NaN (Not a Number, «не является числом»), положительную и отрицательную бесконечность. В некоторых типах приложений эти типы обеспечивают огромный выигрыш в быстродействии, так как вычисления с этими двоичными типами по возможности выполняются на аппаратном уровне.
В Oracle11g появились еще две разновидности вещественных типов. Типы SIMPLE_FLOAT и SIMPLE_DOUBLE являются аналогами BINARY_FLOAT и BINARY_DOUBLE , но они не поддерживают NULL и не инициируют исключение в случае переполнения.
PL/SQL поддерживает несколько числовых типов и подтипов, не имеющих прямого соответствия среди типов баз данных, но все равно полезных. Особого внимания заслуживают PLS_INTEGER и SIMPLE_INTEGER . Операции с целочисленным типом PLS_INTEGER реализуются на аппаратном уровне. В частности, счетчики циклов FOR реализуются в формате PLS_INTEGER . Тип SIMPLE_INTEGER , появившийся в Oracle11g, обладает тем же диапазоном значений, что и PLS_INTEGER , но не поддерживает NULL и не инициирует исключение в случае переполнения. SIMPLE_INTEGER , как и SIMPLE_FLOAT с SIMPLE_DOUBLE , работает невероятно быстро — особенно с откомпилированным кодом.
Дата, время и интервалы
До появления версии Oracle9i представление дат в Oracle ограничивалось типом DATE , в котором хранится дата и время (с округлением до ближайшей секунды). В Oracle9i были введены два новых типа данных, INTERVAL и TIMESTAMP , значительно расширившие возможности разработчиков в отношении операций с датами и временем в PL/ SQL, а также вычисления и хранения временных интервалов. Их использование продемонстрировано в функции, вычисляющей возраст человека в интервальном формате с точностью до месяца:
10 Answers 10
You can definitely get Boolean value from a SELECT query, you just can't use a Boolean data-type.
You can represent a Boolean with 1/0.
Returns, 1 (in Hibernate/Mybatis/etc 1 is true). Otherwise, you can get printable Boolean values from a SELECT.
This returns the string 'true' .
Completely irrelevant to the question though. The question wasn't "how do I use numbers instead of booleans".
You can build a wrapper function like this:
It's up to you what the valid values of ignore_notfound are in your version, I have assumed 'TRUE' means TRUE and anything else means FALSE.
F_IS_YES - callable from any Oracle SQL Usage: SELECT * FROM WHATEVER WHEN F_IS_YES(SOMECOL)=1; Too limiting. How about using the built-in? create or replace function F_IS_YES(pVal IN VARCHAR2) return INTEGER is begin return(sys.diutil.bool_to_int( kdot_blp_util.f_is_yes(pVal)) ); EXCEPTION WHEN OTHERS THEN return 0; -- DISINCLINED TO ACQUIESCE TO YOUR REQUEST - MEANS NO end F_IS_YES; I tried this with the following VARCHAR2 values and they all returned the expected 0 or 1 : YES NO Y N T F y n true false
You cannot insert the values TRUE and FALSE into a database column. You cannot select or fetch column values into a BOOLEAN variable. Functions called from a SQL query cannot take any BOOLEAN parameters. Neither can built-in SQL functions such as TO_CHAR ; to represent BOOLEAN values in output, you must use IF-THEN or CASE constructs to translate BOOLEAN values into some other type, such as 0 or 1 , 'Y' or 'N' , 'true' or 'false' , and so on.
You will need to make a wrapper function that takes an SQL datatype and use it instead.
The BOOLEAN data type is a PL/SQL data type. Oracle does not provide an equivalent SQL data type (. ) you can create a wrapper function which maps a SQL type to the BOOLEAN type.
Compile this in your database and start using boolean statements in your querys.
note: the function get's a varchar2 param, so be sure to wrap any "strings" in your statement. It will return 1 for true and 0 for false;
This particular solution seems like a really a bad option. Why pay the overhead of getting the execute immediate to load and fire here? i guess I can understand the need for some sort of a universal boolean evaluator but not in a SQL statement.
With Oracle 12, you can use the WITH clause to declare your auxiliary functions. I'm assuming your get_something function returns varchar2 :
Of course, you could have also stored your auxiliary function somewhere in the schema as shown in this answer, but by using WITH , you don't have any external dependencies just to run this query. I've blogged about this technique more in detail here.
The answer to this question simply put is: Don't use BOOLEAN with Oracle-- PL/SQL is dumb and it doesn't work. Use another data type to run your process.
A note to SSRS report developers with Oracle datasource: You can use BOOLEAN parameters, but be careful how you implement. Oracle PL/SQL does not play nicely with BOOLEAN, but you can use the BOOLEAN value in the Tablix Filter if the data resides in your dataset. This really tripped me up, because I have used BOOLEAN parameter with Oracle data source. But in that instance I was filtering against Tablix data, not SQL query.
If the data is NOT in your SSRS Dataset Fields, you can rewrite the SQL something like this using an INTEGER parameter:
If the data is in your SSRS Dataset Fields, you can use a tablix filter with a BOOLEAN parameter:
Is there any Boolean type in Oracle databases, similar to the BIT datatype in Ms SQL Server?
@JeffreyKemp That blog is non-sensical. Just because some boolean vales may be calculated based on other fields in a table, doesn't mean all boolean fields may be calculated. For example "is_trusted_customer" where this is true if and only if a human decides, "I trust that person."
@JeffreyKemp Congratulations, you've just reinvented C-style booleans (where you're using int s instead). We should definitely go back to those in code. Additionally, the argument completely falls apart if the data types between table columns and result columns (from a SELECT ) are shared, since it is absolutely appropriate to return a boolean as a computed result sometimes even given the rest of the argument.
Yes. More data types like booleans would give more exact expressive power - you'll get no argument from me on that front. I'm just glad we at least have a DATE type - imagine having to deal with string representations of dates all the time :)
Типы данных ROWID и UROWID
Oracle поддерживает два типа данных ROWID и UROWID , предназначенных для предоставления адреса строки в таблице. Тип ROWID представляет уникальный физический адрес строки в таблице, а тип UROWID — логическую позицию строки в индексной таблице (Index-Organized Table, IOT). Тип ROWID также является псевдостолбцом SQL, который может включаться в инструкции SQL.
Типы данных для сети Интернет в PL/SQL
В версии Oracle9i Database появилась встроенная поддержка различных связанных с Интернетом типов данных и технологий, в частности XML (Extensible Markup Language - расширяемый язык разметки) и URI (Universal Resource Identifiers - универсальные идентификаторы ресурсов). Oracle поддерживает типы данных, используемые для работы с данными XML и URI, а также специальный класс DBUri-REF, который применяется для доступа к данным, хранящимся внутри самой базы данных. Oracle также предоставляет новый набор типов для хранения внешних и внутренних URI и доступа к ним из базы данных.
Тип XMLType позволяет хранить в базе данных Oracle данные XML и обращаться к ним с запросами при помощи таких функций, как SYS_XMLGEN, и пакета DBMS_XMLGEN. Он также позволяет использовать операторы языка SQL для выполнения поиска при помощи языка XPath.
Даты, временные метки и интервалы в PL/SQL
До появления версии Oracle9/ Database мир дат Oracle ограничивался типом DATE, который позволял хранить как дату, так и время (с точностью до секунд). В Oracle9/ Database появились два набора новых связанных типов данных: INTERVAL и TIMESTAMP. Новые типы значительно расширили возможности разработчиков PL/SQL по созданию программ, обрабатывающих и хранящих значения дат и времени с очень высокой точностью, а также вычисляющих и хранящих интервалы времени.
Приведем в качестве примера функцию, вычисляющую возраст человека:
Тип данных REF CURSOR
Тип данных REF CURSOR позволяет объявлять курсорные переменные, которые могут использоваться со статическими и динамическими SQL-командами для улучшения гибкости программного кода. Тип REF CURSOR существует в двух формах: сильной и слабой. PL/SQL относится к категории языков со статической типизацией, а слабый тип REF CURSOR является одной из немногочисленных конструкций с динамической типизацией.
В следующем примере объявления сильной формы REF CURSOR курсорная переменная связывается с конкретной структурой записи с помощью атрибута %ROWTYPE :
Далее следуют два слабых объявления REF CURSOR , в которых переменная не связывается ни с какой конкретной структурой. Во втором объявлении (строка 4) представлен тип SYS_REFCURSOR — заранее определенный слабый тип REF CURSOR .
Пользовательские типы данных
Из встроенных типов данных Oracle и пользовательских типов можно строить типы данных произвольной сложности, которые с большой точностью отражают структуру и поведение данных в конкретных системах. В базе данных Oracle они получили еще название абстрактных типов данных.
При объявлении переменной или константы вы должны назначить ей тип данных, поскольку PL/SQL за очень небольшими исключениями является языком со строгой типизацией. PL/SQL предлагает полный набор предопределенных скалярных и составных типов данных, вы также можете создавать собственные пользовательские типы (которые также называют абстрактными типами данных).
Все имеющиеся предопределенные типы данных определены в PL/ SQL-пакете STANDARD. Например, туда включены операторы, определяющие логический тип данных и два числовых типа:
PL/SQL поддерживает все привычные типы данных и множество других. В данной публикации приведен лишь краткий обзор разнообразных предопределенных типов данных.
Символьные типы данных
PL/SQL поддерживает строки фиксированной и переменной длины, состоящие как из традиционных символов, так и из символов Юникода. К строкам первого типа относятся строки CHAR и NCHAR , а к строкам второго вида — VARCHAR2 и NVARCHAR2 . Объявление строки переменной длины, которая может содержать до 2000 символов, выглядит так:
Для очень длинных символьных строк в PL/SQL предусмотрены типы данных CLOB (Character Large Object) и NCLOB (NLS Character Large Object). По соображениям совместимости PL/SQL также поддерживает тип данных LONG. Эти типы данных позволяют сохранять и обрабатывать очень большие объемы данных; так, в Oracle11g тип LOB способен хранить до 128 терабайт информации.
Использование типа LONG ограничивается множеством правил. Мы не рекомендуем применять его в Oracle8 и последующих версиях.
Типы данных «Any» PL/SQL
Обычно перед программистом стоит вполне конкретная задача с жестко заданными требованиями. Но случается и так, что необходимо написать нечто общее, для широкого применения. В таких случаях удобно использовать типы данных «Any».
Типы «Any» появились в версии Oracle9/ Database Release 1. Они значительно отличаются от любых других типов данных, доступных в Oracle. Эти типы позволяют динамически инкапсулировать описания типов, экземпляры данных и наборы экземпляров данных любого другого типа SQL, а также обращаться к таким объектам. Вы можете использовать эти типы (и методы, определенные для них как для объектных типов), например для определения типа данных, хранящихся в некоторой вложенной таблице, без обращения к реальному объявлению типа данной таблицы.
Группа типов данных «Any» включает в себя AnyType, AnyData и Any- DataSet.
Типы данных «Any»
Большая часть программного кода предназначается для решения узкоспециализированных задач. Однако иногда нам приходится писать более универсальные программы. Именно для таких ситуаций предназначены типы данных Any .
Эта группа типов данных, появившаяся в Oracle9i, заметно отличается от любых других типов данных Oracle. Типы данных Any позволяют динамически инкапсулировать описания типов, экземпляры данных и наборы экземпляров данных любого другого типа SQL. С помощью этих объектных типов (и определенных для них методов) можно, к примеру, определить тип данных, хранимых во вложенной таблице, не обращаясь к объявлению типа этой таблицы!
В группу типов данных Any входят AnyType , AnyData и AnyDataSet .
Двоичные данные
Oracle поддерживает несколько разновидностей двоичных данных — неструктурированных данных, не интерпретируемых и не обрабатываемых Oracle. К их числу относятся типы RAW , BLOB и BFILE . Тип BFILE используется для хранения неструктурированных двоичных данных в файлах операционной системы вне базы данных. Тип RAW имеет переменную длину, а при операциях с ним Oracle не выполняет преобразование символов при передаче данных. В остальном он аналогичен символьному типу VARCHAR2 .
Тип данных LONG RAW поддерживается для обеспечения обратной совместимости, но в PL/SQL поддержка данных LONG RAW ограничена. В базе данных Oracle столбец LONG RAW занимает до 2 Гбайт, но PL/SQL позволяет работать только с первыми 32 760 байтами LONG RAW . Если, например, вы попытаетесь выполнить выборку в переменную PL/SQL из столбца LONG RAW , превышающего лимит в 32 760 байт, произойдет ошибка:
Для работы с данными LONG RAW , превышающими лимит PL/SQL, потребуется программа OCI; кстати, это веская причина для перевода старого кода с LONG RAW на данные BLOB , не имеющие такого ограничения.
ROWID
Oracle поддерживает два собственных типа данных, ROWID и UROWID, которые используются для представления адреса строки в таблице. ROWID - это уникальный адрес строки в соответствующей таблице, а UROWID - логическая позиция строки в индекс-таблице (index-organized table, IOT). ROWID также является SQL-псевдонимом, который может использоваться в командах SQL.
8 Answers 8
I found this link useful.
Here is the paragraph highlighting some of the pros/cons of each approach.
The most commonly seen design is to imitate the many Boolean-like flags that Oracle's data dictionary views use, selecting 'Y' for true and 'N' for false. However, to interact correctly with host environments, such as JDBC, OCCI, and other programming environments, it's better to select 0 for false and 1 for true so it can work correctly with the getBoolean and setBoolean functions.
Basically they advocate method number 2, for efficiency's sake, using
- values of 0/1 (because of interoperability with JDBC's getBoolean() etc.) with a check constraint
- a type of CHAR (because it uses less space than NUMBER).
I advise against using 'N' and 'Y' since it is language dependent. Anglophones sometimes forget that most of the world does not represent the concept of truth with the letter Y. By contrast, the meaning of 0 and 1 is constant across language barriers.
0 and 1 as boolean values aren't consistent within computer science - shell script type languages tend to have 0 as success, and non-zero as failure, while C type languages tend to have 0 as failure, and non-zero as success.
Why was this entire paragraph from the provided link ignored in this answer? "The most commonly seen design is to imitate the many Boolean-like flags that Oracle's data dictionary views use, selecting 'Y' for true and 'N' for false. However, to interact correctly with host environments, such as JDBC, OCCI, and other programming environments, it's better to select 0 for false and 1 for true so it can work correctly with the getBoolean and setBoolean functions." They state that while 'Y/N' is common, using '0/1' to increase compatibility with host environments is recommended.
Oracle itself uses Y/N for Boolean values. For completeness it should be noted that pl/sql has a boolean type, it is only tables that do not.
If you are using the field to indicate whether the record needs to be processed or not you might consider using Y and NULL as the values. This makes for a very small (read fast) index that takes very little space.
+1 Good point about the Oracle internal views and tables using Y/N. If Oracle do it that way it must be right! :)
NULLs aren't indexed in Oracle, so if your index contains a few Y characters, but mostly NULLs you will have a very small index.
To use the least amount of space you should use a CHAR field constrained to 'Y' or 'N'. Oracle doesn't support BOOLEAN, BIT, or TINYINT data types, so CHAR's one byte is as small as you can get.
The best option is 0 and 1 (as numbers - another answer suggests 0 and 1 as CHAR for space-efficiency but that's a bit too twisted for me), using NOT NULL and a check constraint to limit contents to those values. (If you need the column to be nullable, then it's not a boolean you're dealing with but an enumeration with three values. )
Advantages of 0/1:
- Language independent. 'Y' and 'N' would be fine if everyone used it. But they don't. In France they use 'O' and 'N' (I have seen this with my own eyes). I haven't programmed in Finland to see whether they use 'E' and 'K' there - no doubt they're smarter than that, but you can't be sure.
- Congruent with practice in widely-used programming languages (C, C++, Perl, Javascript)
- Plays better with the application layer e.g. Hibernate
- Leads to more succinct SQL, for example, to find out how many bananas are ready to eat select sum(is_ripe) from bananas instead of select count(*) from bananas where is_ripe = 'Y' or even (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Advantages of 'Y'/'N':
- Takes up less space than 0/1
- It's what Oracle suggests, so might be what some people are more used to
Another poster suggested 'Y'/null for performance gains. If you've proven that you need the performance, then fair enough, but otherwise avoid since it makes querying less natural ( some_column is null instead of some_column = 0 ) and in a left join you'll conflate falseness with nonexistent records.
При объявлении переменной или константы необходимо задать ее тип данных (PL/SQL, за некоторыми исключениями, относится к языкам со статической типизацией — см. ниже врезку). В PL/SQL определен широкий набор скалярных и составных типов данных; кроме того, вы можете создавать пользовательские типы данных. Многие типы данных PL/SQL (например, BOOLEAN и NATURAL ) не поддерживаются столбцами баз данных, но в коде PL/SQL эти типы весьма полезны.
Практически все заранее определенные типы данных определяются в пакете PL/SQL STANDARD . Например, определение типа данных BOOLEAN и двух числовых типов данных может выглядеть так:
PL/SQL поддерживает распространенный «джентльменский набор» типов данных, а так-же ряд других типов. В этом разделе приводится краткий обзор различных предопределенных типов данных.
ЧТО ТАКОЕ «СТАТИЧЕСКАЯ ТИПИЗАЦИЯ »?
Статической (или сильной) типизацией называется проверка типов во время компиляции (а не на стадии выполнения программы). К числу языков программирования, использующих сильную типизацию, относятся PL/SQL, Ada, C и Pascal. Языки с динамической типизацией (такие, как JavaScript, Perl или Ruby) выполняют большинство проверок типов во время выполнения. Статическая типизация позволяет выявлять ошибки во время компиляции, что повышает надежность программ. Преимуществом статической типизации является и ускорение выполнения программ. Оптимизирующий компилятор, который знает точные типы данных, может подбирать более эффективные ассемблерные решения и генерировать высокооптимизированный машинный код. Динамическая типизация тоже обладает своими преимуществами: например, метаклассы и интроспекция проще реализуются на базе динамической типизации.
11 Answers 11
Not only is the boolean datatype missing in Oracle's SQL (not PL/SQL), but they also have no clear recommendation about what to use instead. See this thread on asktom. From recommending CHAR(1) 'Y'/'N' they switch to NUMBER(1) 0/1 when someone points out that 'Y'/'N' depends on the English language, while e.g. German programmers might use 'J'/'N' instead.
The worst thing is that they defend this stupid decision just like they defend the ''=NULL stupidity.
Michael-O: I have seen that several times. For me, it's 0/1 all the time, but other programmers prefer J/N. (I live in a German speaking country)
I prefer char(1) because it uses less space. You can check it this way: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; That CHAR is stored: Typ=96 Len=1: 89 and that NUMBER: Typ=2 Len=2: 193,2 At least in 12c, NUMBER(1) can use 2 bytes.
Coming from a Java background, the JDBC specification of ResultSet.getBoolean() says: If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 0, a value of false is returned. If the designated column has a datatype of CHAR or VARCHAR and contains a "1" or has a datatype of BIT, TINYINT, SMALLINT, INTEGER or BIGINT and contains a 1, a value of true is returned. -- Based on this, I would recommend the 0/1 solution over Y/N . Even when using a CHAR column, it's better to use numbers.
Yesterday I wanted to add a boolean field to an Oracle table. However, there isn't actually a boolean data type in Oracle. Does anyone here know the best way to simulate a boolean? Googling the subject discovered several approaches
Use an integer and just don't bother assigning anything other than 0 or 1 to it.
Use a char field with 'Y' or 'N' as the only two values.
Use an enum with the CHECK constraint.
Do experienced Oracle developers know which approach is preferred/canonical?
REF CURSOR
Тип данных REF CURSOR позволяет объявлять курсорные переменные, которые могут использоваться со статическими и динамическими командами SQL для реализации чрезвычайно гибких требований. Этот тип данных имеет две разновидности: строгий REF CURSOR и нестрогий REF CURSOR. Нестрогий REF CURSOR - это один из немногих доступных вам типов данных со слабой типизацией.
Рассмотрим пример объявления строгого типа REF CURSOR (ассоциируем курсорную переменную с конкретной записью при помощи атрибута %ROWTYPE):
Теперь рассмотрим два объявления нестрогого типа REF CURSOR, в которых никакая конкретная структура не ассоциируется с результирующей переменной. В четвертой строке представлен SYS_REFCURSOR, пред¬определенный нестрогий тип REF CURSOR.
Логические данные
PL/SQL поддерживает тип данных BOOLEAN . Переменные этого типа могут принимать одно из трех значений ( TRUE, FALSE или NULL ).
Логические переменные помогают писать понятный, легко читаемый код даже в тех случаях, когда он содержит очень сложные логические выражения. Пример объявления логической переменной с присваиванием ей значения по умолчанию:
Читайте также: