我有一个第 3 方 JAR,我已将其制作成 UDF,如下所示:
CREATE OR REPLACE FUNCTION MY_DB.MY_SCHEMA.my_udf("FOO" ARRAY)
RETURNS OBJECT
LANGUAGE JAVA
HANDLER = '<proper path>'
IMPORTS = ('@MY_STAGE/path/to/my_jar.jar')
;
这在大多数情况下都有效,但有时会返回
java.lang.IllegalArgumentException
。
如何使 SELECT 使所有错误都变为 NULL 作为返回值?
基本上,
SELECT NULLIF(my_udf([foo]), IS_ERROR())
我可以更改 UDF CREATE 块或 SELECT 文本,但不能更改底层 JAR。
您可以使用少量内联代码来包装对第三方库的调用,例如:
CREATE OR REPLACE FUNCTION MY_DB.MY_SCHEMA.my_udf("FOO" ARRAY)
RETURNS OBJECT
LANGUAGE JAVA
HANDLER = 'WrapperCode.handler'
IMPORTS = ('@MY_STAGE/path/to/my_jar.jar') AS
'''
import java.util.Map;
class WrapperCode {
public static Map<String, String> handler(String[] foo) {
try {
return com.third_party.library.handler(foo);
} catch (Exception e) {
return null;
}
}
}
''';
现在如果第三方库抛出异常,它会被捕获,并且处理程序方法将返回
null
。 (我不确定参数/返回类型是否正确,但如果需要,您可以更新它们。)