Postgres SQL 存储过程给出错误:xxx(字符变化)是一个过程提示:要调用过程,请使用 CALL

问题描述 投票:0回答:1

下面是我在 Spring Boot 中部署为 Web 服务的 Java 代码。我正在尝试调用 rmsadmin 模式中部署在本地主机中的存储过程

public String saveUserDetails()
{
    String return_message = new String();
    String url = "jdbc:postgresql://127.0.0.1:5432/rms";
    String user = "postgres";
    String password = "postgres";

    try 
    {
        Class.forName("org.postgresql.Driver");
        Connection connection = DriverManager.getConnection(url, user, password);
        CallableStatement callableStatement = connection.prepareCall("{call rmsadmin.insert_user_details(?, ?)}");
            // Set the JSON parameter
            String jsonParam = "{\"employee_id\": \"2\", \"user_name\": \"John\", \"user_email\":\"[email protected]\"}";
            callableStatement.setString(1, jsonParam);
            callableStatement.registerOutParameter(2, Types.VARCHAR);
            callableStatement.execute();
            String status = callableStatement.getString(2);
    
            // Retrieve the status OUT parameter
            return_message = "Status: " + status;
    
    } 
    catch (SQLException e) {
        return_message = "Error calling stored procedure: " + e.getMessage();
    }
    catch (ClassNotFoundException e) 
    {
         return_message = "Error calling stored procedure: " + e.getMessage();
    }
    return return_message;
}

下面是我在 postgres plpgsql 中的存储过程。它接受 json 输入并将值插入表中并将输出参数设置为成功

CREATE OR REPLACE PROCEDURE rmsadmin.insert_user_details
(
    IN json_data VARCHAR
    ,OUT status VARCHAR
)
AS
$$
DECLARE
json_obj JSONB;
employee_id_val TEXT;
user_name_val TEXT;
user_email_val TEXT;
BEGIN
\-- Parse the JSON string into a JSON object
json_obj := json_data::JSONB;

    -- Extract the desired fields from the JSON object
    employee_id_val := json_obj->>'employee_id';
    user_name_val := json_obj->>'user_name';
    user_email_val := json_obj->>'user_email';
    
    -- Insert the extracted fields into a table
    INSERT INTO rmsadmin."User" (employee_id, user_name, user_email) VALUES (employee_id_val, user_name_val, user_email_val);
    
    -- Set status to indicate success
    status := 'Success';

EXCEPTION
WHEN others THEN
    \-- Set status to indicate failure
    status := 'Error: ' || SQLERRM;
END;
$$ LANGUAGE plpgsql;

我收到以下错误,无法理解问题所在。

调用存储过程时出错:

错误:rmsadmin.insert_user_details(字符变化)是一个过程提示:要调用过程,请使用 CALL。位置:15

请帮我解决这个问题。我已经浪费了几个小时来解决这个问题。

我尝试将数据插入表中并通过浏览器查看Web服务调用的成功消息

java postgresql spring-boot jdbc spring-jdbc
1个回答
0
投票

您的架构/数据库是

rms
,这是您应该在前缀中使用的名称。存储过程不应有前缀或使用

"{call rms.insert_user_details(?, ?)}"

存储过程:

CREATE OR REPLACE PROCEDURE insert_user_details
(
    IN json_data VARCHAR,
    OUT status VARCHAR
)
© www.soinside.com 2019 - 2024. All rights reserved.