Skip to Main Content

Japanese

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

PL/SQLの実行について

955617Aug 14 2012 — edited Aug 15 2012
VC++2005 MFC+OCCIにて、以下のようにエラーメッセージを取得しています。
Oracle10g (10.2.0.3.0)

CString OCCIWrap::GetErrorMessage(int errCode)
{
  CString szReturn(_T(""));
  Statement* oraStmt;
  CString szSQL = _T("BEGIN :a := sqlerrm(-:v1); END;");

  try {
    // Connection* m_oraConは事前に接続済み
    oraStmt = m_oraCon->createStatement((LPCTSTR)szSQL);
    oraStmt->setInt(2, errCode);
    oraStmt->registerOutParam(1, OCCISTRING, 2048, "");
    oraStmt->executeUpdate();

    szReturn = (LPCTSTR)oraStmt->getString(1).c_str();
    m_oraCon->terminateStatement(oraStmt);
  }
  catch (SQLException& ex) {
    szReturn = ex.getMessage().c_str();
  }
  return szReturn;
}

これをODP.NETに書き直そうとして、以下のようにしました。

using namespace System;
using namespace System::Data;
using namespace Oracle::DataAccess::Client;
using namespace Oracle::DataAccess::Types;

String^ ODPWrap::GetErrorMessage(int errCode)
{
  String^ szReturn = gcnew String(L"");
  String^ szSQL = gcnew String(L"BEGIN :ret_val := sqlerrm(-:err_code); END;");

  try {
    // OracleConnection^ m_oraConは事前に接続済み
    OracleCommand^ oraCmd = gcnew OracleCommand(szSQL, m_oraCon);
    oraCmd->CommandType = CommandType::StoredProcedure;
    OracleParameter^ paramOut = oraCmd->Parameters->Add(L":ret_val", OracleDbType::Varchar2, ParameterDirection::Output);
    OracleParameter^ paramIn = oraCmd->Parameters->Add(L":err_code", OracleDbType::Int32, ParameterDirection::Input);
    paramIn->Value = errCode;

    oraCmd->ExecuteNonQuery();

    szReturn = paramOut->Value->ToString();
  }
  catch (OracleException^ e) {
    // デバッグ用
    szReturn = e->Message;
  }
  return szReturn;
}

実行するとOracleExceptionが発生してしまいます。
メッセージ内容は以下でした。

ORA-06550: 行1、列50:
PLS-00103: 記号"("が見つかりました。 次のうちの1つが入るとき:

begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << close current delete fetch lock insert
open rollback savepoint set sql execute commit forall merge
pipe
記号"case" は続行のために"("に代わりました。
ORA-06550: 行1、列60:
PLS-00103: 記号";"が見つかりました。 次のうちの1つが入るとき:

* & = - + < / > at in is mod remainder not rem when
<an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
LIKE4_ LIKEC_ between overlaps

ODP.NETでは、このような構文は許されないのでしょうか?
(CommandType::StoredProcedureとしている時点でアウトな気もしますが...)


結局、以下のようなファンクションを作成して実行すればエラーメッセージを取得できました。
CREATE OR REPLACE FUNCTION
GETSQLERRMTEXT(err_code IN NUMBER) RETURN VARCHAR2
IS
ret_value VARCHAR2(2048);
BEGIN
ret_value := sqlerrm(-err_code);
RETURN ret_value;
END;

ファンクションを作成しないで、エラーメッセージを取得する方法があれば教えてください。
よろしくお願いします。
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 12 2012
Added on Aug 14 2012
3 comments
8,626 views