Проблемы с запуском процедуры из JDBC

495
01 сентября 2021, 23:10

Есть такая процедура, она работает из консоли, когда я ввожу 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)
Answer 1

Как вариант: 1. У пользователя, под которым соединяется JDBC, недостаточно прав. 2. Не та БД

Answer 2

Поскольку в Postgres параметр у вас заявлен как INOUT, то надо вызывать его так:

 CallableStatement cs = conn.prepareCall("{CALL products_count(?)}"); 
 cs.registerOutParameter(1, Types.BIGINT);
 cs.setNull(1, Types.BIGINT); //явно указываем что на входе параметр null
 cs.execute();
Answer 3

Я узнал, что в настоящее время (начиная с 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));
}
READ ALSO
Broadcaster Receiver не работает

Broadcaster Receiver не работает

У меня есть два слушателя BroadcastReceiverSms и BroadcastReceiverCall которые отслеживают когда на телефон ЗВОНЯТ и приходит СМС и выводят оповещение с вибрациейКогда...

291
Как превратить String[][] в Map<String, Map<Integer, List<String[]>>>

Как превратить String[][] в Map<String, Map<Integer, List<String[]>>>

интересует красивый способ преобразования двумерного массива строк в мапу, значениями которой будет мапа, значениями которой будет список...

174
Почему здесь прибавляют 1?

Почему здесь прибавляют 1?

Добрый день не могу разобраться с кодом почему к переменной in добавляют 1

94
Не могу присвоить в переменную значение &quot;+&quot;, считанное Scannerом

Не могу присвоить в переменную значение "+", считанное Scannerом

Программа - калькуляторВвожу в консоли в строку значения, сканер их считывает

195