1

OCILIBを使用しています。

この形式のステートメントCREATE OR REPLACE PROCEDURE AA1 AS BEGIN XXX; END;は常に成功します (つまり、エラーや警告は報告されません)。ステートメントが正しくコンパイルされたかどうかを確認するにはどうすればよいですか?

その情報を取得する機能があるはずです(私は願っています)。

問題を示す簡単で汚い例を次に示します。

#include <stdio.h>
#include <ocilib.h>

void print_error() {
  printf("Error:");
  OCI_Error *err = OCI_GetLastError();
  if (err) printf(" %d: %s\n", OCI_ErrorGetOCICode(err), OCI_ErrorGetString(err));
  else printf(" no error.");
  printf("\n");
}

int main (int argc, char **argv) {
  OCI_Connection *cn;
  OCI_Statement *st;

  OCI_EnableWarnings(TRUE);

  if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT | OCI_ENV_CONTEXT)) {
    puts("Failed to initialize OCI");
    return 2;
  }

  cn = OCI_ConnectionCreate("XE", "<your user>", "<your pwd>", OCI_SESSION_DEFAULT);
  print_error();

  OCI_SetAutoCommit(cn, TRUE); print_error();
  st = OCI_StatementCreate(cn); print_error();

  OCI_ExecuteStmt(st, "create or replace procedure aaa as begin garbage end;");
  print_error();

  OCI_Cleanup();

  return 0;
}

出力:

$ ./ocitest
Error: no error.
Error: no error.
Error: no error.
Error: no error.
4

2 に答える 2

1

OCILIB に、SQL 警告が正しく報告されないという問題がありました。これは修正されており、OCILIB リポジトリは修正されて最新の状態になっています :)

于 2013-10-10T16:14:48.680 に答える
1

user_objectsビューでステータスを確認できます。

select status
from user_objects
where object_type = 'PROCEDURE'
and object_name = 'AA1';

そうでない場合は、ビューVALIDを照会して実際のエラーを取得できます。user_errors

select * -- or just line, position and text
from user_errors
where type = 'PROCEDURE'
and name = 'AA1'
order by sequence;

例外が発生しないことに驚いていますが、これは私が使用するスタックではありません...

于 2013-10-07T15:44:10.370 に答える