はい、あなたはバインドパラメータとして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を使用する理由はありませんが、多分あなたの実際の例では、より複雑です。
なぜそれを直接実行しないのですか? – ibre5041
なぜそれに対して動的SQLを使用したいのか分かりませんが、varSQL文字列値に一重引用符をエスケープしていないので、コンパイルがまったく驚いています。コンテキストがないので、 'EXECUTE IMMEDIATE'がパッケージ本体の225行であることを確認できます。これはパッケージをコンパイルするときに表示される実行時エラーです。 –
はい、いくつかのエラーを修正したコードのバージョンで試したXMLTypeを渡すことができます。セミコロンがない、1行目が正しくない、エスケープされた引用符です。表示されているエラーを再現するために実行できる完全なコードブロックとして、実際に実行していることを示しておけば役に立ちます。 PXMLは実際にXMLTypeですか、またはvarchar2/CLOBですか?文字列の場合はエラーが発生しますので、それが問題なのです。 –