【发布时间】:2022-01-25 08:37:11
【问题描述】:
我正在尝试创建一个存储过程,该过程将从视图中获取所有列并在 CLOB 上为其生成 XML 数据。
CREATE OR REPLACE PROCEDURE PaGenerarServicioXML(vIdViaje IN NUMBER, vIDCliente IN varchar)
IS
ServicioXML CLOB;
BEGIN
SELECT DBMS_XMLGEN.GETXML (q'!
SELECT *
FROM VwServicio VwS
WHERE VwS.Identificador_Viaje = vIdViaje
AND VwS.Identificador_Cliente = vIdCliente
!')
INTO ServicioXML
FROM DUAL;
SYS.DBMS_OUTPUT.PUT_LINE(ServicioXML);
END;
EXECUTE PaGenerarServicioXML(2,'304560326')
存储过程保存正确。
当我执行这个存储过程时,会抛出以下错误:
ORA-19202: Error occurred in XML processing
ORA-00904: "VIDCLIENTE": invalid identifier ORA-06512: at "SYS.DBMS_XMLGEN", line 176
ORA-06512: at "SYS.DBMS_XMLGEN", line 7
ORA-06512: at "SYS.DBMS_XMLGEN", line 164
ORA-06512: at line 1
ORA-06512: at "SQL_MBFTRUKIWLGITBRTRBBHFHTSA.PAGENERARSERVICIOXML", line 6
ORA-06512: at line 1
ORA-06512: at "SYS.DBMS_SQL", line 1721
如果我删除 WHERE 子句中的 AND 语句,错误将更改为未将 VIDVIAJE 标识为有效。为什么不接受我刚刚创建的输入变量?
在VwServicio 视图中,Identificador_Viaje 是一个INT 数据类型,而Identificador_Cliente 是一个VARCHAR,所以我真的不明白问题出在哪里。
【问题讨论】:
-
如您所见,
getxml中的 SQL 文本是一个字符串。它不(也不能)知道任何关于外部变量的信息,因为它在不同的事务中执行,具有自己的内容,如execute immediate。您需要将该值注入 SQL 文本