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

Код: 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
19.05.2020, 10:15
    #39959278
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
AleksRous,

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


Выдаёт нормальный результат, проблема где-то в другом месте.
...
Рейтинг: 0 / 0
19.05.2020, 10:22
    #39959282
AleksRous
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 10:47
    #39959294
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
AleksRous,

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

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



Как задать верный формат , слажите пжт ?
...
Рейтинг: 0 / 0
19.05.2020, 11:22
    #39959320
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 11:23
    #39959321
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
AleksRous
crutchmaster
AleksRous,

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



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


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

Не трогай лучше его. Проблема где-то в другом месте.
...
Рейтинг: 0 / 0
19.05.2020, 12:49
    #39959401
AleksRous
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 13:17
    #39959420
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 14:07
    #39959466
AleksRous
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 15:16
    #39959532
AleksRous
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 16:45
    #39959578
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 16:47
    #39959580
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
19.05.2020, 17:58
    #39959614
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
AleksRous,

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

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

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


Код: 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
20.05.2020, 08:50
    #39959757
AleksRous
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
Заданите вопрос почему именно EXECUTE IMMEDIATE , отвечу там
Код: xml
1.
EXECUTE IMMEDIATE 'DDL CREATE TABLE AS ...'
...
Рейтинг: 0 / 0
20.05.2020, 09:03
    #39959761
AleksRous
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
этот вариант прокатит

Код: 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
20.05.2020, 10:36
    #39959786
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
AleksRous

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





Если это писал привыкший к временным таблицам MSSQL-щик, лучше переписать. Проблем в любой БД и так хватает, чтобы к ним добавлять проблемы динамического SQL.
...
Рейтинг: 0 / 0
20.05.2020, 12:17
    #39959813
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
20.05.2020, 19:18
    #39960049
AleksRous
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORA-00904: invalid identifier
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-00904: invalid identifier / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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