Есть такая процедура, она работает из консоли, когда я ввожу call products_count(null) - она работает.
CREATE PROCEDURE products_count(INOUT cnt BIGINT)
LANGUAGE SQL
AS $$
SELECT count(*) FROM products;
$$;
А вот мой код с использованием JDBC:
package com.lesson.ten.procedures;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
public class Main
{
public static void main(String[] args) throws ClassNotFoundException, SQLException
{
Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/products", "postgres", "parol22");
Statement st = conn.createStatement();
st.executeUpdate("DROP TABLE IF EXISTS products");
st.executeUpdate("CREATE TABLE products(id INT8 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, productName varchar(30) NOT NULL,"
+ " manufacturer varchar(20) NOT NULL, productCount INT DEFAULT 0, price MONEY NOT NULL)");
st.executeUpdate("INSERT INTO products(productName, manufacturer, productCount, price) VALUES ('apple', 'babaZina', 33, 5000)");
st.executeUpdate("INSERT INTO products(productName, manufacturer, productCount, price) VALUES ('orange', 'babaNina', 99, 3003)");
st.executeUpdate("INSERT INTO products(productName, manufacturer, productCount, price) VALUES ('orange', 'babaNina', 333, 3003)");
st.executeUpdate("INSERT INTO products(productName, manufacturer, productCount, price) VALUES ('orange', 'babaNina', 3333, 3003)");
Вот что я пытался делать:
CallableStatement cs = conn.prepareCall("{CALL products_count(?)}");
cs.registerOutParameter(1, Types.BIGINT);
cs.execute();
}
}
Exception in thread "main" org.postgresql.util.PSQLException: ОШИБКА: функция products_count() не существует
Подсказка: Функция с данными именем и типами аргументов не найдена. Возможно, вам следует добавить явные приведения типов.
Позиция: 15
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143)
at org.postgresql.jdbc.PgCallableStatement.executeWithFlags(PgCallableStatement.java:77)
at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:132)
at com.lesson.ten.procedures.Main.main(Main.java:51)
Как вариант: 1. У пользователя, под которым соединяется JDBC, недостаточно прав. 2. Не та БД
Поскольку в Postgres параметр у вас заявлен как INOUT
, то надо вызывать его так:
CallableStatement cs = conn.prepareCall("{CALL products_count(?)}");
cs.registerOutParameter(1, Types.BIGINT);
cs.setNull(1, Types.BIGINT); //явно указываем что на входе параметр null
cs.execute();
Я узнал, что в настоящее время (начиная с Postgres 11.1 и версии драйвера 42.2.5) стандартный метод JDBC с использованием CallableStatement
не может использоваться для вызова хранимой процедуры, я использовал PreparedStatement
:
PreparedStatement ps = conn.prepareStatement("CALL products_count(?)");
ps.setInt(1, Types.BIGINT);
ps.execute();
ResultSet rs = ps.getResultSet();
while(rs.next()) {
System.out.println(rs.getInt(1));
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня есть два слушателя BroadcastReceiverSms и BroadcastReceiverCall которые отслеживают когда на телефон ЗВОНЯТ и приходит СМС и выводят оповещение с вибрациейКогда...
интересует красивый способ преобразования двумерного массива строк в мапу, значениями которой будет мапа, значениями которой будет список...
Добрый день не могу разобраться с кодом почему к переменной in добавляют 1
Программа - калькуляторВвожу в консоли в строку значения, сканер их считывает