Oracle11g 在executeimmediate中传递XML

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;

这会产生以下错误:

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;
      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