CREATE PROCEDURE - 如何检查是否成功编译?

时间:2013-10-07 15:39:17

标签: oracle client oci

我正在使用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.

2 个答案:

答案 0 :(得分:1)

OCILIB中存在未正确报告SQL警告的问题。这是固定的,OCILIB存储库是最新的修复:)

答案 1 :(得分:0)

您可以在user_objects view

中查看状态
select status
from user_objects
where object_type = 'PROCEDURE'
and object_name = 'AA1';

如果不是VALID,您可以通过查询user_errors view来获取实际错误:

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

我很惊讶你没有得到异常,但这不是我使用的堆栈......