Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / Java vs PosgreSQL Insert / 15 сообщений из 15, страница 1 из 1
04.03.2021, 14:01
    #40050645
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
Добрый день.

Пытаюсь сделать INSERT в БД PostgreSQL, вылазит такая ошибка:

Код: java
1.
2.
org.postgresql.util.PSQLException: ERROR: procedure new_order(integer, integer, integer, character varying, character varying) does not exist
  Подсказка: No procedure matches the given name and argument types. You might need to add explicit type casts.



Сами коды:
Хранимая процедура в PostgreSQL:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE PROCEDURE public.new_order(IN member_id integer, IN product_id integer, IN quantity integer, IN approvalstatus text, IN transactiondate date)
    LANGUAGE 'plpgsql'
    
AS $BODY$
Declare
   transact_id INT;
Begin
	SELECT MAX(transaction_id) INTO transact_id FROM Transactions;
	INSERT INTO Transactions VALUES(transact_id + 1, member_id, product_id, quantity, approvalstatus, transactiondate);
END;
$BODY$;



Код в Java:
Код: java
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.
	public boolean addOrder(
			int MEMBER_ID, 
			int PRODUCT_ID, 
			int QUANTITY, 
			String TRANSACTION_DATE) {
		
		boolean isAdded = false;
		
		try {
			_preparestatement = _connection.prepareStatement("call new_order(?,?,?,?,?)");
			_preparestatement.setInt(1, MEMBER_ID);
			_preparestatement.setInt(2, PRODUCT_ID);
			_preparestatement.setInt(3, QUANTITY);
			_preparestatement.setString(4, "PENDING");
			_preparestatement.setString(5, TRANSACTION_DATE);
			_preparestatement.execute();
			
			isAdded = true;
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		
		return isAdded;
	}



Вызываю метод:
Код: java
1.
2.
	LocalDate now = LocalDate.now();
	_database.addOrder(member_id, prod_id, quant, now.toString());
...
Рейтинг: 0 / 0
04.03.2021, 14:12
    #40050654
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
sql:
IN transactiondate date
java:
String TRANSACTION_DATE
...
Рейтинг: 0 / 0
04.03.2021, 14:29
    #40050668
Garrick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
LiQuid,

_preparestatement = _connection.prepareStatement("call public. new_order(?,?,?,?,?)");

не пробовали?
...
Рейтинг: 0 / 0
04.03.2021, 15:44
    #40050712
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
Garrick,

Пробовал, все равно та же ошибка.
...
Рейтинг: 0 / 0
04.03.2021, 15:48
    #40050718
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
am_sasa,

Так любая БД принимает String как Date со среды Java, с PostgreSQL по другому? К тому же БД не принимает не только transactiondate date, так же предпоследний параметр в хранимой процедуре IN approvalstatus text так же не принимает, я пробовал и IN approvalstatus varchar, та же ошибка.
Сколько раз отправлял в столбец Date в БД со среды Java в такие БД как Oracle, MS SQL Server, MS Access, SQLite..и все они String "01-01-2021" к примеру спокойно принимали и вставляли в столбец с типом Date в БД.
Что не так с PostgreSQL? У нее что ограничение?
...
Рейтинг: 0 / 0
04.03.2021, 16:01
    #40050733
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
Ответили же сразу что не так.
...
Рейтинг: 0 / 0
04.03.2021, 16:03
    #40050734
Alexander A. Sak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
А, сейчас увидел, что претензия к отсутствию преобразования типов. Ну тут смириться. Всегда можно будет сделать вариант, когда работает не так, как ожидалось.
...
Рейтинг: 0 / 0
04.03.2021, 16:12
    #40050745
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
Пришлось использовать sql.date

Код: java
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.
26.
27.
28.
...
import java.sql.Date;
.....
	public boolean addOrder(
			int MEMBER_ID, 
			int PRODUCT_ID, 
			int QUANTITY, 
			Date TRANSACTION_DATE) {
		
		boolean isAdded = false;
		
		try {
			_preparestatement = _connection.prepareStatement("call public.new_order(?,?,?,?,?)");
			_preparestatement.setInt(1, MEMBER_ID);
			_preparestatement.setInt(2, PRODUCT_ID);
			_preparestatement.setInt(3, QUANTITY);
			_preparestatement.setString(4, "PENDING");
			_preparestatement.setDate(5, TRANSACTION_DATE);
			_preparestatement.execute();
			
			isAdded = true;
		}
		catch (SQLException e) {
			e.printStackTrace();
		}
		
		return isAdded;
	}



Код: java
1.
2.
3.
4.
5.
6.
...
import java.sql.Date;
...
	long millis=System.currentTimeMillis();
	Date now = new Date(millis);
	_database.addOrder(member_id, prod_id, quant, now);


Insert заработал.
Просто по с другими БД такой ерунды никогда не было, можно было спокойно String "dd-mm-yyyy" отправлять со среды Java и БД вставляла в стоблец типом Date переданную переменную String.
А вот с PostgreSQL надо четко указывать тип переменной.

Всем спасибо.
...
Рейтинг: 0 / 0
04.03.2021, 18:15
    #40050816
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
LiQuid,

в общем для хранимок такое
Код: sql
1.
2.
3.
4.
5.
			_preparestatement.setInt(1, MEMBER_ID);
			_preparestatement.setInt(2, PRODUCT_ID);
			_preparestatement.setInt(3, QUANTITY);
			_preparestatement.setString(4, "PENDING");
			_preparestatement.setString(5, TRANSACTION_DATE);


не требуется
достаточно
Код: java
1.
_preparestatement = _connection.prepareStatement("call public.new_order( "+MEMBER_ID +","+ ........)");


тогда и дата будет вставляться строкой.
...
Рейтинг: 0 / 0
04.03.2021, 18:49
    #40050830
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
LiQuid

Просто по с другими БД такой ерунды никогда не было, можно было спокойно String "dd-mm-yyyy" отправлять со среды Java и БД вставляла в стоблец типом Date переданную переменную String.


Для 99.0000% СУБД и сред, представление данных зависит от локали

Неявное преобразование String -> Data в 90% - чистое везение и гуанокод. За очень редким исключением, когда это точно описано в документации и/или специально прибито гвозьдями.
...
Рейтинг: 0 / 0
04.03.2021, 19:13
    #40050832
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
LiQuid
Так любая БД принимает String как Date
... если повезёт.
Хотите, чтобы везло чаще - используйте литералы дат:
Код: psql
date'ГГГГ-ММ-ДД'
.
Хотите, чтобы работало - передавайте требуемый тип, а не то, что вам вздумается.
...
Рейтинг: 0 / 0
04.03.2021, 19:43
    #40050845
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
LiQuid

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE PROCEDURE public.new_order(IN member_id integer, IN product_id integer, IN quantity integer, IN approvalstatus text, IN transactiondate date)
    LANGUAGE 'plpgsql'
    
AS $BODY$
Declare
   transact_id INT;
Begin
	SELECT MAX(transaction_id) INTO transact_id FROM Transactions;
	INSERT INTO Transactions VALUES(transact_id + 1, member_id, product_id, quantity, approvalstatus, transactiondate);
END;
$BODY$;



Тут - странно как-то. У тебя возможен вариант что параллельно работающие потоки одновременно прочитают
одинаковый transaction_id и вставят его. И будет 2 ордера с одинаковым ID или конфликт уникального ключа.

Проверял?
...
Рейтинг: 0 / 0
04.03.2021, 19:45
    #40050846
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
LiQuid

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	public boolean addOrder(
			int MEMBER_ID, 
			int PRODUCT_ID, 
			int QUANTITY, 
			String TRANSACTION_DATE) {
		
		boolean isAdded = false;
		
		try {
			_preparestatement = _connection.prepareStatement("call new_order(?,?,?,?,?)");


А это зачем? Подчеркивание. Бывший сишник? Тебе не достаточно Java-инкапсуляции? И нужно еще какие-то дополнительные
хитрые символы вводить?
...
Рейтинг: 0 / 0
05.03.2021, 07:32
    #40050931
LiQuid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
mayton,

Угадал, бывший С-шник.
...
Рейтинг: 0 / 0
05.03.2021, 11:29
    #40051010
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java vs PosgreSQL Insert
mayton

Бывший сишник?

Плохой сишник )))

connection.prepareStatement - есть
а
preparestatement.close - нет

В высоконагруженной системе - ресурс леак однако. AFAIK

p.s.
1) в Java НЕТ диструкторов. Хотя есть finallize, который НЕ является диструктором и из-за которого только хуже. Т.к. в низконагруженной системе ресурс леак можно не заметить, а в высоконагруженной, когда все начнет на проде падать - уже мата не хватает, весь код перелапачивать и close() раставлять.
2)
в Java сейчас есть try for resource
в данном случае, это значительно лучше, чем ненужный и даже вредный catch

IMHO
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java vs PosgreSQL Insert / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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