Oracle11g 在executeimmediate中传递XML
这会产生以下错误: ORA-06550:第9行第15列: PLS-00382:表达式类型错误 ORA-06550:第9行第2列: PL/SQL:忽略语句 ORA-06512:“BIZZXE V2系统实用程序”第225行 655000000-“行%s,列%s:\n%s” *原因:通常是PL/SQL编译错误。 *行动:Oracle11g 在executeimmediate中传递XML,oracle11g,Oracle11g,这会产生以下错误: ORA-06550:第9行第15列: PLS-00382:表达式类型错误 ORA-06550:第9行第2列: PL/SQL:忽略语句 ORA-06512:“BIZZXE V2系统实用程序”第225行 655000000-“行%s,列%s:\n%s” *原因:通常是PL/SQL编译错误。 *行动: 是否可以传递XML?是的,可以将XMLType变量作为绑定参数传递: varSQL: = 'DECLARE varOptionId NUMBER;
是否可以传递XML?是的,可以将XMLType变量作为绑定参数传递:
varSQL: = 'DECLARE
varOptionId NUMBER;
varXML XMLTYPE;
varHsCode VARCHAR2(200);
varHsCodeCount NUMBER;
varId NUMBER;
RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL);
BEGIN
varXML:=:refXML;
varHsCode:= varXML.EXTRACT('/OBJECT/HsCodes/HsCode/text()').GETSTRINGVAL();
:out:=varHsCode;
END';
EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut;
在您的示例中,没有任何理由使用动态SQL,但您的实际示例可能更复杂。为什么不直接执行它?不知道为什么要使用动态SQL,但是您在varSQL字符串值中有unescape单引号,所以我很惊讶它可以编译。我们没有上下文,因此您能否确认
EXECUTE IMMEDIATE
是程序包正文的第225行,这是一个运行时错误,在编译程序包时看不到这一点?是的,您可以传递一个XMLType,只是尝试了一个版本的代码,修复了一些错误-缺少分号,第一行的赋值不正确,转义引号。如果您将实际运行的内容显示为一个完整的代码块,我们可以运行它来重新创建您看到的错误,这将非常有用。PXML实际上是XMLType还是varchar2/CLOB?如果是一个字符串,就会出现这个错误,所以很确定这就是问题所在。我只给出了一个示例代码。感谢您的replyPXML是XMLTYPE
declare
varsql varchar2(1024);
varout varchar2(4);
pxml xmltype := xmltype('<OBJECT><HsCodes><HsCode>Test</HsCode></HsCodes></OBJECT>');
begin
varSQL := 'DECLARE
varOptionId NUMBER;
varXML XMLTYPE;
varHsCode VARCHAR2(200);
varHsCodeCount NUMBER;
varId NUMBER;
--RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL);
BEGIN
varXML:=:refXML;
varHsCode:= varXML.EXTRACT(''/OBJECT/HsCodes/HsCode/text()'').GETSTRINGVAL();
:out:=varHsCode;
END;';
EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut;
dbms_output.put_line(varOut);
end;
/
PL/SQL procedure successfully completed.
Test
declare
varsql varchar2(1024);
varout varchar2(4);
</HsCodes></OBJECT>');
pxml varchar2(64) := '<OBJECT><HsCodes><HsCode>Test</HsCode></HsCodes></OBJECT>';
begin
varSQL := 'DECLARE
varOptionId NUMBER;
varXML XMLTYPE;
varHsCode VARCHAR2(200);
varHsCodeCount NUMBER;
varId NUMBER;
--RVAL OBJ_RETURN:=OBJ_RETURN(NULL,NULL,NULL,NULL);
BEGIN
varXML:=:refXML;
varHsCode:= varXML.EXTRACT(''/OBJECT/HsCodes/HsCode/text()'').GETSTRINGVAL();
:out:=varHsCode;
END;';
EXECUTE IMMEDIATE varSQL USING PXML,OUT varOut;
dbms_output.put_line(varOut);
end;
/
Error report -
ORA-06550: line 9, column 10:
PLS-00382: expression is of wrong type
ORA-06550: line 9, column 2:
PL/SQL: Statement ignored
ORA-06512: at line 21