gpt4 book ai didi

java - 来自 Java 的甲骨文。对象参数的 CallableStatement 和 Null?

转载 作者:搜寻专家 更新时间:2023-11-01 01:51:59 26 4
gpt4 key购买 nike

我明白了,从一个相当复杂的存储过程开始,归结为一个非常简单的用例,但似乎并没有像我预期的那样工作。

对于我的测试,存储过程现在看起来像这样:

CREATE OR REPLACE PROCEDURE proc_test(
v_someString varchar2
) as
BEGIN
dbms_output.put_line('test');
END;

我可以使用可调用语句 API 从 java 调用此存储过程

java.sql.CallableStatement stmt = conn.prepareCall("call proc_test(?)");
stmt.setObject(1,null);
stmt.execute();

以上工作正常。该方法成功执行并完成。现在变得棘手了。我们创建了一组 oracle 对象类型,以允许我们传递类似于以下的更复杂的结构

CREATE OR REPLACE
type SOMETYPE_TYPE force UNDER BASE_TYPE (value varchar2(255),
CONSTRUCTOR FUNCTION SOMETYPE_TYPE RETURN SELF AS RESULT) NOT FINAL;

如果我简单地更改程序以接受这些类型作为参数,如下所示:

CREATE OR REPLACE PROCEDURE proc_test(
v_someString SOMETYPE_TYPE
) as
BEGIN
dbms_output.put_line('test');
END;

Oracle 将中断 PLS-00306:调用“CNV_CREATE_PERSON”时参数的数量或类型错误

什么给了?如果我从另一个以 null 为值的过程调用此过程,它工作正常。只有从 java API 调用它才会中断。

我一直在搜索任何解决方案的文档,但找不到一个。也许你们中的一位睿智博学的人可以为我指明正确的方向。

谢谢

最佳答案

您需要使用 the setNull() method指定您的用户定义类型:

void setNull(String parameterName,
int sqlType,
String typeName)
throws SQLException

Sets the designated parameter to SQL NULL. This version of the method setNull should be used for user-defined types and REF type parameters. Examples of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and named array types.

Note: To be portable, applications must give the SQL type code and the fully-qualified SQL type name when specifying a NULL user-defined or REF parameter. In the case of a user-defined type the name is the type name of the parameter itself. For a REF parameter, the name is the type name of the referenced type.

所以在你的情况下:

stmt.setNull(1, java.sql.Types.STRUCT, "SOMETYPE_TYPE");

如果你只是传递 null 那么它不知道它代表什么类型并且不能做任何隐式转换。这确实意味着您的代码需要根据您的 Java 对象是否为 null 进行分支,以根据需要调用 setNull()setObject()

对于您的 varchar2 示例,您确实应该使用 setNull(),但可以使用 the simpler version ,如:

stmt.setNull(1, java.sql.Types.VARCHAR);

...但是您只需传递 null 即可。

关于java - 来自 Java 的甲骨文。对象参数的 CallableStatement 和 Null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25729225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com