【问题标题】:wrong number or types of arguments while calling Stored Proc调用 Stored Proc 时参数的数量或类型错误
【发布时间】:2020-08-10 17:54:17
【问题描述】:

我从 Spring Data JPA 调用存储过程:

程序是:

create or replace procedure GET_LATEST_GC (arg1 IN VARCHAR2, res1 OUT VARCHAR2, res2 OUT VARCHAR2)
AS
BEGIN
  DELETE FROM GC_T WHERE id = arg1;

  COMMIT;

  BEGIN
    SELECT gc.NAME, s.SIP INTO res1, res2
    FROM GC_T gc, STAFF_T s WHERE s.id = gc.id 
    AND START_TIME = (SELECT MAX(START_TIME) FROM GC_T);

  EXCEPTION
  WHEN others THEN  
    res1 := '';    
  END;
END;

Spring Data JPA 代码

//存储库

 public interface ActiveDao extends JpaRepository<GcT,Integer>  {
        @Procedure(procedureName="GET_LATEST_GC")
        Object[] plus1(@Param("arg1") String arg1);
    }

//实体

@Data
@Entity
@NamedStoredProcedureQuery(name = "GET_LATEST_GC",
        procedureName = "GET_LATEST_GC", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg1", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res1", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res2", type = String.class)})
@Table(schema = "abc", name = "GC_T")
public class GcT implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String name;


}

//调用

Object[] activeGCInfo =activeDao.plus1(arg);

程序接受一个参数,我也传递了 1 个参数。然后我也收到此错误:

休眠:{调用 GET_LATEST_GC(?,?)} 错误 ohejdbc.spi.SqlExceptionHelper - ORA-06550:第 1 行,第 7 列:\nPLS-00306:调用“GET_LATEST_GC”时参数的数量或类型错误\nORA-06550:第 1 行,第 7 列:\nPL/SQL : 语句被忽略\n

请让我知道我哪里做错了。 谢谢

更新 - 也根据建议尝试添加 OUT 参数

//Repo
 public interface ActiveDao extends JpaRepository<GcT,Integer>  {
            @Procedure(procedureName="GET_LATEST_GC")
            Object[] plus1(@Param("arg1") String arg1,@Param("res1") String res1,@Param("res2") String res2);
        }

//Call
Object[] activeGCInfo =activeDao.plus1(arg,"","");

我正在发送三个参数,但它显示我有 4 个参数错误:

休眠:{call GET_LATEST_GC(?,?,?,?)} SqlExceptionHelper - ORA-06550:第 1 行,第 7 列:\nPLS-00306:错误的数量或类型 调用“GET_LATEST_GC”的参数\nORA-06550:第 1 行,第 1 列 7:\nPL/SQL: 语句被忽略\n

【问题讨论】:

  • 尝试为参数设置相同的名称 (arg1 != arg)
  • 对不起,打错字了。在代码中,它只是一样。

标签: oracle stored-procedures spring-data-jpa


【解决方案1】:

尝试将结果从 Object[] 更改为 Map&lt;String, Object,同时使用 name 而不是 procedureName 引用 proc 名称。基于错误,我不确定它会修复它。 Spring Data JPA 确实期望 Map 作为多个输出参数的返回值,因此每个输出参数都可以作为该 Map 中的键找到。但我认为主要错误是procedureName直接映射到db,但是name=会映射到正确的Entity

//Repo
 public interface ActiveDao extends JpaRepository<GcT,Integer>  {
            @Procedure(name="GET_LATEST_GC")
            Map<String, Object> plus1(@Param("arg1") String arg1);
        }

//Call
Map<String, Object> activeGCInfo =activeDao.plus1(arg);

【讨论】:

  • 你好杰夫,非常感谢你。现在我可以得到 2 个参数 :)
【解决方案2】:

事情是这样的:

  • 您声明了一个带有 3 个参数的过程:1 in 和 2 out
  • 您说:“程序接受一个参数,我也传递 1 个参数”
    • 这是第一个过程的参数 (arg1 IN)
    • 导致“PLS-00306:参数数量或类型错误”

当然可以;您需要再提供 2 个参数(数据类型应该能够接受过程返回的VARCHAR2 值)。

【讨论】:

  • 感谢您的回复,我尝试在存储库方法中添加参数。现在错误更改为 4 个参数,而我只需要发送 3 个参数。语法是否正确?我检查了 Spring doc,但他们给出了一个参数的例子。
  • 对不起,我不知道Spring;我所能做的就是指出你在甲骨文方面做错了什么。
  • np Littlefoot,还有谁能指出这个问题。谢谢
猜你喜欢
  • 2019-12-23
  • 1970-01-01
  • 2021-07-15
  • 2018-03-22
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多