spring 获取Oracle错误PLS-00306:调用存储过程时参数的数目或类型错误,并且找不到位置

snz8szmq  于 2023-02-15  发布在  Spring
关注(0)|答案(1)|浏览(284)

我是Oracle新手,正在使用Spring和Hibernate。我尝试从Oracle调用存储过程并执行它,但我的日志中出现错误,无法指出SQL查询中的错误位置。此外,不允许我编辑SQL。
程序:

procedure STORED_PROCEDURE
     ( first in varchar2
     , second in varchar2
     , third in varchar2
     , fourth inout varchar2
     , fifth inout varchar2
     , sixth in boolean
     );

这是访问存储过程的代码。它包含4个IN参数和2个INOUT参数。我将三个变量硬编码到setParameter片段中(第四、第五和第六个)。错误发生在execute上。

StoredProcedureQuery query = entityManager.createStoredProcedureQuery("STORED_PROCEDURE")
    .registerStoredProcedureParameter("first", String.class, ParameterMode.IN)
    .registerStoredProcedureParameter("second", String.class, ParameterMode.IN)
    .registerStoredProcedureParameter("third", String.class, ParameterMode.IN)
    .registerStoredProcedureParameter("fourth", String.class, ParameterMode.INOUT)
    .registerStoredProcedureParameter("fifth", String.class, ParameterMode.INOUT)
    .registerStoredProcedureParameter("sixth", Boolean.class, ParameterMode.IN)
    .setParameter("first", var1)
    .setParameter("second", var2)
    .setParameter("third", var3)
    .setParameter("fourth", "value")
    .setParameter("fifth", "value")
    .setParameter("sixth", true);

query.execute();

完整错误:

Caused by: oracle.jdbc.OracleDatabaseException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'STORED_PROCEDURE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我曾尝试将布尔参数更改为Integer.class,因为我了解到SQL和布尔值可能存在问题,但没有任何效果。

fzsnzjdm

fzsnzjdm1#

在Oracle中,SQL中没有BOOLEAN数据类型,但PL/SQL中有BOOLEAN数据类型。这意味着如果将过程声明为:

procedure STORED_PROCEDURE
     ( first  in     varchar2
     , second in     varchar2
     , third  in     varchar2
     , fourth in out varchar2
     , fifth  in out varchar2
     , sixth  in     boolean
     );

那么它只能从PL/SQL范围调用,而不能从SQL调用。
您可能希望更改为使用SQL和PL/SQL都支持的数据类型,并将该过程定义为:

procedure STORED_PROCEDURE
     ( first  in     varchar2
     , second in     varchar2
     , third  in     varchar2
     , fourth in out varchar2
     , fifth  in out varchar2
     , sixth  in     number
     );

然后,在过程内部,您可以将sixth0/1值转换为布尔值FALSE/TRUE

相关问题