2

OracleのXMLType関数を使用して、カーソルを返すストアドプロシージャからXMLデータを取得しています。私のSQLは次のようになります。

select 
XMLType(
    package_name.storedProcName('PARAM1', 'PARAM2', 'PARAM3')
) as sresult 
from dual;

ストアドプロシージャがレコードを返す場合、これは正常に機能し、期待どおりのXML結果が得られます。ただし、プロシージャがレコードを返さない場合、次のエラーが発生します。

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 334
ORA-06512: at line 1

この場合、null、空白の文字列、またはその他の値を返すことが望ましいです。確かに、これが発生するたびにOracle例外が発生するのは避けたいと思います。これを達成するために何ができますか?

明確化:私の問題は、ストアドプロシージャが空のカーソルを返すと、XMLTypeコンストラクターが例外を発生させることです。SQLクエリ内の空のカーソルを検出するにはどうすればよいですか?(残念ながら、私にはOracle側でプログラミングする余裕がありません。Javaクライアントをプログラミングしています。)

4

2 に答える 2

4

SQLソリューションの場合:

select 
XMLType.createxml(
    package_name.storedProcName('PARAM1', 'PARAM2', 'PARAM3')
) as sresult 
from dual;

コンストラクターのバグを回避する必要があります。

例えば

SQL> select xmltype.createxml(mycur(0)) from dual;

XMLTYPE.CREATEXML(MYCUR(0))
-------------------------------------------------------------------------------


SQL> select xmltype(mycur(0)) from dual;
ERROR:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 334
ORA-06512: at line 1



no rows selected

x
SQL>
于 2012-12-13T13:06:49.370 に答える
0

例外処理の同じ問題を解決しました

begin
  xml:=xmltype(cur);
exception when others then 
  dbms_output.put_line(sqlerrm);
  xml:=xmltype('<ROWS></ROWS>');
end;
于 2013-10-30T03:50:17.463 に答える