powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00904: invalid identifier
21 сообщений из 21, страница 1 из 1
ORA-00904: invalid identifier
    #39959273
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задал глобальную переменную в процедуре.

Код: plsql
1.
2.
3.
DECLARE

v_date DATE := TO_DATE('01/05/2001' , 'DD/MM/YYYY');



Выдает ошибку

ORA-00904: "MAY": invalid identifier

Каким форматом мне нужно задать переменную v_date , чтобы не выдавало ошибку ?
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959278
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous,

Код: plsql
1.
DATE('01/05/2001' , 'DD/MM/YYYY')


Выдаёт нормальный результат, проблема где-то в другом месте.
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959282
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
AleksRous,

Код: plsql
1.
DATE('01/05/2001' , 'DD/MM/YYYY')


Выдаёт нормальный результат, проблема где-то в другом месте.



raise_application_error (-20004 , v_date);

Выдал

ORA-20004: 19-MAY-20


Отдельный SELECT норм выдает в процедуре 19-MAY-20
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959294
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous,

Ну, всё правильно, он cast в строку делает, а у тебя в настройках такой дефолтный формат даты.
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959310
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
AleksRous,

Ну, всё правильно, он cast в строку делает, а у тебя в настройках такой дефолтный формат даты.



Как задать верный формат , слажите пжт ?
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959320
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous
Задал глобальную переменную в процедуре.

Код: plsql
1.
2.
3.
DECLARE

v_date DATE := TO_DATE('01/05/2001' , 'DD/MM/YYYY');



Выдает ошибку

ORA-00904: "MAY": invalid identifier

Каким форматом мне нужно задать переменную v_date , чтобы не выдавало ошибку ?


Ошибка в какой строке?
Пример вызова и полное сообщение об ошибке.
Скорее всего, у Вас где-то вызов:
Код: plsql
1.
to_date(date_type,'DD/MM/YYYY') 



Что приводит к неявному преобразованию перед вызовом:
Код: plsql
1.
to_date(to_char(date_type),'DD/MM/YYYY')


А поскольку у to_char нет формата, то используется формат по умолчанию.
В результате, Вы получаете
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959321
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous
crutchmaster
AleksRous,

Ну, всё правильно, он cast в строку делает, а у тебя в настройках такой дефолтный формат даты.



Как задать верный формат , слажите пжт ?


Не нужно задавать формат по умолчанию, аккуратнее отслеживайте преобразования типов
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959334
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous
Как задать верный формат , слажите пжт ?

Не трогай лучше его. Проблема где-то в другом месте.
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959401
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
AleksRous
Как задать верный формат , слажите пжт ?

Не трогай лучше его. Проблема где-то в другом месте.


например


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE 

v_date VARCHAR2(50):= TO_DATE(TO_CHAR('01/05/2020'),'DD/MM/YYYY') ;

BEGIN

    EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = ' ||  v_date || '' ;
    
END ;
/




ORA-00904: "MAY": invalid identifier
ORA-06512: at line 7
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959420
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous
crutchmaster
пропущено...

Не трогай лучше его. Проблема где-то в другом месте.


например


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE 

v_date VARCHAR2(50):= TO_DATE(TO_CHAR('01/05/2020'),'DD/MM/YYYY') ;

BEGIN

    EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = ' || to_char(v_date) || '' ;
    
END ;
/




ORA-00904: "MAY": invalid identifier
ORA-06512: at line 7


В результате получишь:

Код: plsql
1.
EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = 1-MAY-20'


То есть все равно что попытаться выполнить:
Код: plsql
1.
SELECT * FROM DUAL WHERE DUMMY = 1-MAY-20



Вопросы есть? Чему равно numeric выражение:
1-MAY-20

Начни документации

https://docs.oracle.com/database/121/LNPLS/dynamic.htm#GUID-7E2F596F-9CA3-4DC8-8333-0C117962DB73 7 PL/SQL Dynamic SQL


Вопросы есть?
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959466
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin
AleksRous
пропущено...


например


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE 

v_date VARCHAR2(50):= TO_DATE(TO_CHAR('01/05/2020'),'DD/MM/YYYY') ;

BEGIN

    EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = ' || to_char(v_date) || '' ;
    
END ;
/




Я понял вас выдает правильно то что в NLS_DATE_FORMAT , но как прописать чтобы селект прокатил

ORA-00904: "MAY": invalid identifier
ORA-06512: at line 7


В результате получишь:

Код: plsql
1.
EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = 1-MAY-20'


То есть все равно что попытаться выполнить:
Код: plsql
1.
SELECT * FROM DUAL WHERE DUMMY = 1-MAY-20



Вопросы есть? Чему равно numeric выражение:
1-MAY-20

Начни документации

https://docs.oracle.com/database/121/LNPLS/dynamic.htm#GUID-7E2F596F-9CA3-4DC8-8333-0C117962DB73 7 PL/SQL Dynamic SQL



Вопросы есть?
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959532
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AleksRous
Vadim Lejnin
пропущено...


В результате получишь:

Код: plsql
1.
EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = 1-MAY-20'


То есть все равно что попытаться выполнить:
Код: plsql
1.
SELECT * FROM DUAL WHERE DUMMY = 1-MAY-20



Вопросы есть? Чему равно numeric выражение:
1-MAY-20

Начни документации

пропущено...



Вопросы есть?



Я понял вас выдает правильно то что в NLS_DATE_FORMAT , но как прописать чтобы селект прокатил
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959578
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous,

Вы ничего не поняли


1) Мессир, NLS_DATE_FORMAT зависит от настроек сессии. Настройки сессии могут быть любыми. Поэтому правильно написанные программа не должна от них зависеть, если зависимость есть, то это так называемая NLS BOMBA

2) Что понять, разберитесь хотя бы, почему у Вас вместо операции со строкой, как Вы хотели, получилось number выражение

3) Чтобы контролировать, что же Вы пытаетесь выполнить, добавьте тестовый вывод SQL строки, протестируйте полученную строку в другой сессии, и только после этого можно использовать execute immediate

DECLARE

v_date date:= TO_DATE(TO_CHAR('01/05/2020'),'DD/MM/YYYY') ;
v_cmd varchar2(1024);

BEGIN
v_cmd :='SELECT * FROM DUAL WHERE DUMMY = ' || to_char(v_date) || ''
==> dbms_output.put_line(v_cmd);
>>>--<<< EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = ' || to_char(v_date) || '' ;

END ;
/
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959580
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous,

SRC забыл добавить:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE

v_date date:= TO_DATE(TO_CHAR('01/05/2020'),'DD/MM/YYYY') ;
v_cmd varchar2(1024);

BEGIN
v_cmd :='SELECT * FROM DUAL WHERE DUMMY = ' || to_char(v_date) || ''
 dbms_output.put_line(v_cmd);
-- EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE DUMMY = ' || to_char(v_date) || '' ;

END ;
/
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959614
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous,

откройте для себя литералы date и ,имхо, всё наладится
Код: plsql
1.
2.
3.
4.
5.
6.
7.
DECLARE

  v_date date :=  date'2001-05-01';

BEGIN
..
END ;
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959754
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если так


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DECLARE

 v_date  DATE:=  TO_DATE('01/05/2020' , 'DD/MM/YYYY') ;
 v_cmd VARCHAR2(1024);

BEGIN

EXECUTE IMMEDIATE '

WITH TEMP AS 
             ( SELECT TO_DATE(''01/05/2001'' , ''DD/MM/YYYY'') SYS_DATE FROM DUAL )
             
SELECT * FROM TEMP  WHERE  SYS_DATE = ' ||  v_date ||  '';


dbms_output.put_line(v_cmd);



END;


Мне нужно объявить глоб. переменную , чтобы в каждой процедуре не менять.

В пакете около 50 процедур. Спасибо вам добрые люди за потраченное на меня время
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959757
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заданите вопрос почему именно EXECUTE IMMEDIATE , отвечу там
Код: xml
1.
EXECUTE IMMEDIATE 'DDL CREATE TABLE AS ...'
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959761
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
этот вариант прокатит

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE

 v_date  VARCHAR2(50) := '''01/05/2020''' ;
 v_cmd VARCHAR2(1024);

BEGIN

EXECUTE IMMEDIATE '

WITH TEMP AS 
             ( SELECT TO_DATE(''01/05/2001'' , ''DD/MM/YYYY'') SYS_DATE FROM DUAL )
             
SELECT * FROM TEMP  WHERE  SYS_DATE = TO_DATE(' ||  v_date || ' , ''DD/MM/YYYY'' ) ';


dbms_output.put_line(v_cmd);

END;



но не v_date VARCHAR2(50) := SYSDATE ;
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959786
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous

Код: plsql
1.
EXECUTE IMMEDIATE 'DDL CREATE TABLE AS ...'





Если это писал привыкший к временным таблицам MSSQL-щик, лучше переписать. Проблем в любой БД и так хватает, чтобы к ним добавлять проблемы динамического SQL.
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39959813
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksRous,

1) Если Вы посмотрите синтаксис EXECUTE IMMEDIATE Statement

Вы с удивлением увидите кляузы USING и INTO

2) Использовать строковое представление data, да еще со встроенными ковычками, это ампутация гланд через нетрадиционное отверстия

3) Если Вы перечитаете "Как правильно задавать вопросы", то там сказано что нужно рассказывать что Вы хотите сделать, и только потом как. Иначе получается пункт 2


p.s. Понятно что у Вас не хватает опыта в oracle, но решая задачи, как Вы себе это представляете, Вы лепите экзотические конструкции, мужественно борясь с целыми россыпями граблей.
Сформулируйте что собственно Вы хотите, Вам подскажут как это решается правильно.

Вот например комментарии по Вашему решению:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
DECLARE

-- date должно быть date, это избавить от ошибок неявного преобразования , при использовании bind variable, 
-- никаих TO_CHAR  в EXECUTE IMMEDIATE не потребуется. 
-- Вопросы первоначальной инициализации date literal Вы можете найти в PL/SQL Reference
-- если v_date нужно задавать в начале каждого месяца, то существует date expression
 
 v_date  VARCHAR2(50) := '''01/05/2020''' ;

 v_cmd VARCHAR2(1024);

BEGIN

-- для использования bind переменных существует кляуза USING в EXECUTE IMMEDIATE
EXECUTE IMMEDIATE '

WITH TEMP AS 
             ( SELECT TO_DATE(''01/05/2001'' , ''DD/MM/YYYY'') SYS_DATE FROM DUAL )
             
SELECT * FROM TEMP  WHERE  SYS_DATE = TO_DATE(' ||  v_date || ' , ''DD/MM/YYYY'' ) ';

-- Вы же планируете как то использовать полученные данные? для этого есть кляуза INTO в EXECUTE IMMEDIATE
dbms_output.put_line(v_cmd);

END;
...
Рейтинг: 0 / 0
ORA-00904: invalid identifier
    #39960049
AleksRous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin
AleksRous,

1) Если Вы посмотрите синтаксис EXECUTE IMMEDIATE Statement

Вы с удивлением увидите кляузы USING и INTO

2) Использовать строковое представление data, да еще со встроенными ковычками, это ампутация гланд через нетрадиционное отверстия

3) Если Вы перечитаете "Как правильно задавать вопросы", то там сказано что нужно рассказывать что Вы хотите сделать, и только потом как. Иначе получается пункт 2


p.s. Понятно что у Вас не хватает опыта в oracle, но решая задачи, как Вы себе это представляете, Вы лепите экзотические конструкции, мужественно борясь с целыми россыпями граблей.
Сформулируйте что собственно Вы хотите, Вам подскажут как это решается правильно.

Вот например комментарии по Вашему решению:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
DECLARE

-- date должно быть date, это избавить от ошибок неявного преобразования , при использовании bind variable, 
-- никаих TO_CHAR  в EXECUTE IMMEDIATE не потребуется. 
-- Вопросы первоначальной инициализации date literal Вы можете найти в PL/SQL Reference
-- если v_date нужно задавать в начале каждого месяца, то существует date expression
 
 v_date  VARCHAR2(50) := '''01/05/2020''' ;

 v_cmd VARCHAR2(1024);

BEGIN

-- для использования bind переменных существует кляуза USING в EXECUTE IMMEDIATE
EXECUTE IMMEDIATE '

WITH TEMP AS 
             ( SELECT TO_DATE(''01/05/2001'' , ''DD/MM/YYYY'') SYS_DATE FROM DUAL )
             
SELECT * FROM TEMP  WHERE  SYS_DATE = TO_DATE(' ||  v_date || ' , ''DD/MM/YYYY'' ) ';

-- Вы же планируете как то использовать полученные данные? для этого есть кляуза INTO в EXECUTE IMMEDIATE
dbms_output.put_line(v_cmd);

END;



Спасибо я вас понял
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00904: invalid identifier
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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