2016-04-07 11 views
0
 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; 

を実行渡す:XMLは、これは次のエラーを与える即時

ORA-06550:行9、列15: PLS-00382:式が間違った型 ORA-06550である:9行目、 ORA-06512: "BIZZXE_V2_SCH.SYSTEM_UTILITY"、行225 06550. 00000 - "行%s、列%s:\ n%s" 原因:通常PL/SQLコンパイルエラー。 *アクション:

XMLを渡すことはできますか?

+1

なぜそれを直接実行しないのですか? – ibre5041

+0

なぜそれに対して動的SQLを使用したいのか分かりませんが、varSQL文字列値に一重引用符をエスケープしていないので、コンパイルがまったく驚いています。コンテキストがないので、 'EXECUTE IMMEDIATE'がパッケージ本体の225行であることを確認できます。これはパッケージをコンパイルするときに表示される実行時エラーです。 –

+0

はい、いくつかのエラーを修正したコードのバージョンで試したXMLTypeを渡すことができます。セミコロンがない、1行目が正しくない、エスケープされた引用符です。表示されているエラーを再現するために実行できる完全なコードブロックとして、実際に実行していることを示しておけば役に立ちます。 PXMLは実際にXMLTypeですか、またはvarchar2/CLOBですか?文字列の場合はエラーが発生しますので、それが問題なのです。 –

答えて

0

はい、あなたはバインドパラメータとしてXMLTypeの変数を渡すことができます:あなたは文字列としてPXML宣言したので

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 

あなたが取得しているエラーがあります。どちらかvarchar2またはCLOB変数:

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 

はあなたの例では、とにかく、動的SQLを使用する理由はありませんが、多分あなたの実際の例では、より複雑です。