【发布时间】:2019-02-02 00:26:26
【问题描述】:
在执行接受并返回 BLOB 数据的 Oracle Java 过程时出现以下错误,
错误报告 - ORA-00932:不一致的数据类型:预期返回 值,它是用户定义的 Java 类的实例,可转换为 Oracle 类型得到一个无法转换的对象 ORA-06512: 在 “”,第 86 行 ORA-06512:第 7 行 00932. 00000 - “不一致的数据类型:预期的 %s 得到了 %s” *原因:
*行动:
Java 代码
public static java.sql.Blob Convert_Image(java.sql.Blob srcBlob) {
java.sql.Blob desBlob = null;
try {
Document document = new Document();
ByteArrayOutputStream pdfDocumentOutputStream = new ByteArrayOutputStream();
PdfWriter pdfDocumentWriter = PdfWriter.getInstance(document, pdfDocumentOutputStream);
document.open();
if (document.newPage()) {
int indentation = 0;
Image img = Image.getInstance(srcBlob.getBytes(1, (int) srcBlob.length()));
float scaler = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin() - indentation;
img.scalePercent((scaler / img.getWidth()) * 100);
document.newPage();
document.add(Image.getInstance(img));
document.close();
desBlob = new SerialBlob(pdfDocumentOutputStream.toByteArray());
pdfDocumentWriter.close();
pdfDocumentOutputStream.close();
}
}
catch (Exception e) {
Show_Message(e);
}
return desBlob;
}
Oracle 代码
FUNCTION CONVERT_IMAGE(
P_BLOB IN DOCUMENTS.BLOB_CONTENT%TYPE)
RETURN BLOB
AS
LANGUAGE JAVA NAME 'egift.Util.Convert_Image (java.sql.Blob) return java.sql.Blob';
触发器实现
...
DECLARE
v_blob_content DOCUMENTS.BLOB_CONTENT%TYPE;
BEGIN
IF :NEW.BLOB_CONTENT IS NOT NULL AND
(
NVL(:NEW.MIME_TYPE,'#') = 'image/png' OR
NVL(:NEW.MIME_TYPE,'#') = 'image/jpeg' OR
NVL(:NEW.MIME_TYPE,'#') = 'image/gif' OR
NVL(:NEW.MIME_TYPE,'#') = 'image/tiff' OR
NVL(:NEW.MIME_TYPE,'#') = 'image/bmp'
) THEN
v_blob_content := EGIFT_UTIL.CONVERT_IMAGE(:NEW.BLOB_CONTENT);
IF v_blob_content is not null then
:NEW.BLOB_CONTENT := v_blob_content;
:NEW.MIME_TYPE := 'application/pdf';
:NEW.NAME := substr(:NEW.NAME,0,instr(:NEW.NAME,'.',-1)) || 'pdf';
END IF;
END IF;
...
【问题讨论】:
-
所显示的代码都不会抛出异常并出现错误。请显示导致错误的实际代码。
-
仅供参考: 不需要使用
Blob,反正你只是要使用一个字节数组。使用字节数组。 -
请显示异常的(完整)堆栈跟踪。
-
@Andreas 是的,看起来一切都很好,但并不是因为它引发了运行时错误。我认为 Oracle 无法将数据类型 java.sql.Blob 的返回值转换为 Oracle BLOB 数据类型。您提到了使用字节数组,您能否提供一个示例来详细说明。
-
嗨@kapiell,一旦我在将 Blob 转换为 java.sql.Blob 时遇到问题。我使用 oracle.sql.BLOB 而不是这个类。不幸的是,我没有 Oracle 实例来测试解决方案。可以请你自己检查一下吗?
标签: java oracle java-7 oracle12c