powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PLSQL Char vs Varchar2
16 сообщений из 16, страница 1 из 1
PLSQL Char vs Varchar2
    #39551073
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE mytable
(
  ID NUMBER NOT NULL,
  NAME CHAR(20) NOT NULL,
  .........

И есть функция
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE FUNCTION myfunc (in_name IN VARCHAR2)
RETURN  NUMBER
AS
  var_res NUMBER;
BEGIN
  dbms_output.put_line(in_name);
  SELECT
    COUNT(*)
  INTO
    var_res
  FROM
    mytable
  WHERE
    NAME = in_name;
  RETURN var_res;
END;


В таблице есть запись с именем test

Вызываю
Код: plsql
1.
SELECT myfunc('test') FROM DUAL;


И получаю 0. Но если переопределить входной параметр функции
Код: plsql
1.
CREATE FUNCTION myfunc (in_name IN CHAR)


то все работает.

Объясните, почему не работает с VARCHAR2? in_name корректно выводится через dbms_output.put_line()

И еще вопрос. Я не могу указать размер входного параметра? Если пишу так
Код: plsql
1.
CREATE FUNCTION myfunc (in_name IN CHAR(20))

то получаю ошибку
PLS-00103: Encountered the symbol "(" when expecting one of the following:

:= ) , default varying character large
(Line: 1 Col: 47)

С уважением, Vasilisk
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551076
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не может char(10) быть 'test'. Он будет дополнен пробелами до 10 знаков.
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551079
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

CHAR datatype
The CHAR data type specifies a fixed-length character string in the database character set
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551083
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55Не может char(10) быть 'test'. Он будет дополнен пробелами до 10 знаков.Тогда почему такой запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
  SELECT
    COUNT(*)
  INTO
    var_res
  FROM
    mytable
  WHERE
    NAME = 'test'

возвращает правильный результат?
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551089
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

попробуй с
Код: plsql
1.
cast('test' as varchar2(10))

,
подумай
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551092
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table dropme_t (a char(10));

insert into dropme_t values('test');

select a, length(a) from dropme_t;

select 1 from dropme_t where a = 'test';

select 1 from dropme_t where a = cast('test' as varchar2(10));

drop table dropme_t purge;
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551098
_Vasilisk_,
Если очень приближенно и на пальцах, то потому что литерал 'TEST' имеет тип CHAR и при сравнении с полем типа CHAR дополняется справа пробелами до длины, определенной для поля таблицы при ей создании (это семантика сравнения типа данных CHAR - сравниваемые значения дополняются справа пробелами до одинаковой длинны и сравниваются посимвольно). В итоге у тебя сравнивается значение поля со значением выражения rpad('TEST',' ',20). То есть работает примерно такое сравнение:
'TEST ' = rpad('TEST',' ',20)

При сравнении же с varchar2 работает конструкции:
'TEST ' (char(20) => VARCHAR2(20)) = 'TEST' (varchar2(4))
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551100
Добрый Э - Эх_Vasilisk_,
Если очень приближенно и на пальцах, то потому что литерал 'TEST' имеет тип CHAR и при сравнении с полем типа CHAR дополняется справа пробелами до длины, определенной для поля таблицы при ей создании (это семантика сравнения типа данных CHAR - сравниваемые значения дополняются справа пробелами до одинаковой длинны и сравниваются посимвольно). В итоге у тебя сравнивается значение поля со значением выражения rpad('TEST',' ',20). То есть работает примерно такое сравнение:
Код: plsql
1.
2.
3.
4.
'TEST                ' =  rpad('TEST',' ',20)

При сравнении же с varchar2 работает конструкции:
'TEST                ' (char(20) => VARCHAR2(20)) = 'TEST' (varchar2(4))
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551107
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envподумайЕсли в запросе test кастуется к CHAR на основании типа поля, то почему так же скастоваться не может переменная?

Почему для такой функции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE FUNCTION SF_I_TEST(in_id IN CHAR)
RETURN  NUMBER
AS
  var_res NUMBER;
BEGIN
  SELECT
    COUNT(*)
  INTO
    var_res
  FROM
    com_data_guids
  WHERE
    ID = in_id;
  RETURN var_res;
END

все кастуется и возвращается результат с таким вызовом
Код: plsql
1.
SELECT sf_i_test('0') FROM dual

и даже с таким
Код: plsql
1.
SELECT sf_i_test('0  ') FROM dual

Почему мы переменную CHAR можем скастовать в NUMBER, а VARCHAR2 в CHAR нет?
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551111
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхПри сравнении же с varchar2 работает конструкции:
'TEST ' (char(20) => VARCHAR2(20)) = 'TEST' (varchar2(4))Т.е. Вы хотите сказать, что не параметр кастуется к типу поля, а тип поля кастуется к типу параметра?
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551117
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Добрый Э - ЭхПри сравнении же с varchar2 работает конструкции:
'TEST ' (char(20) => VARCHAR2(20)) = 'TEST' (varchar2(4))Т.е. Вы хотите сказать, что не параметр кастуется к типу поля, а тип поля кастуется к типу параметра?
Да. Запрос
Код: plsql
1.
select * from table where char_field = число 


в случае наличия в char_field нецифровых символов упадет с ошибкой. И да, при несовпадении типов индексы не работают.
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551123
_Vasilisk_,

Дело не в сравнении поля таблицы и параметра, а в сравнении значения ОДНОГО типа со значением ДРУГОГО типа. У оракула есть определенные правила на этот счёт. К примеру, символьные типы при сравнении с числовыми типами или типами даты-времени преобразуются к числам и датам. При сравнении Char и varchar происходит преобразование типа char к типу varchar. И т.д.
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551127
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistДа.Сюрприз! Спасибо большое за пояснение
MazoHistпри несовпадении типов индексы не работают.Ну это логичный вывод из первого утверждения
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551130
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхИ т.д.Лучше давать ссылку на документацию.
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551131
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхУ оракула есть определенные правила на этот счётМожно тынц?
...
Рейтинг: 0 / 0
PLSQL Char vs Varchar2
    #39551185
_Vasilisk_,

где-то тут
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / PLSQL Char vs Varchar2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]