powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Java vs PosgreSQL Insert
15 сообщений из 15, страница 1 из 1
Java vs PosgreSQL Insert
    #40050645
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Пытаюсь сделать 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
Java vs PosgreSQL Insert
    #40050654
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sql:
IN transactiondate date
java:
String TRANSACTION_DATE
...
Рейтинг: 0 / 0
Java vs PosgreSQL Insert
    #40050668
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid,

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

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

Пробовал, все равно та же ошибка.
...
Рейтинг: 0 / 0
Java vs PosgreSQL Insert
    #40050718
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Java vs PosgreSQL Insert
    #40050733
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответили же сразу что не так.
...
Рейтинг: 0 / 0
Java vs PosgreSQL Insert
    #40050734
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, сейчас увидел, что претензия к отсутствию преобразования типов. Ну тут смириться. Всегда можно будет сделать вариант, когда работает не так, как ожидалось.
...
Рейтинг: 0 / 0
Java vs PosgreSQL Insert
    #40050745
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пришлось использовать 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
Java vs PosgreSQL Insert
    #40050816
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Java vs PosgreSQL Insert
    #40050830
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid

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


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

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

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

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

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

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

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

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

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


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