PL/SQL脚本的错误控制

博客提到 sqlca.sqlerrm.sqlerrmc 包含描述错误的字符串,且该字符串以源文件行号结尾,涉及数据库相关的 SQL 错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要想检测从  Postgres 服务器来得错误,你要包含如下一行
      exec sql include sqlca;
到你的文件的包含段里.这样做将会定义一个结构和一个象下面一样名为 sqlca 的变量:
struct sqlca
{
 char sqlcaid[8];
 long sqlabc;
 long sqlcode;
 struct
 {
  int sqlerrml;
  char sqlerrmc[70];
 } sqlerrm;
 char sqlerrp[8];
 long sqlerrd[6];
 /* 0: empty                                         */
 /* 1: OID of processed tuple if applicable          */
 /* 2: number of rows processed in an INSERT, UPDATE */
 /*    or DELETE statement                           */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 char sqlwarn[8];
 /* 0: set to 'W' if at least one other is 'W'       */
 /* 1: if 'W' at least one character string          */
 /*    value was truncated when it was               */
 /*    stored into a host variable.                  */
 /* 2: empty                                         */
 /* 3: empty                                         */
 /* 4: empty                                         */
 /* 5: empty                                         */
 /* 6: empty                                         */
 /* 7: empty                                         */
 char sqlext[8];
} sqlca;
如果最后一个 SQL 语句发生了错误,那么 sqlca.sqlcode 将是非零值.如果 sqlca.sqlcode 小于 0 那么就是发生了某种严重的错误,象数据库定义与查询定义不一致等.如果大于 0 则是通常的错误,象表不包括所要求的行等.

sqlca.sqlerrm.sqlerrmc 将包含一个字符串描述该错误.该字符串以源文件的行号结尾。

可能发生的错误列表:
  -12, Out of memory in line %d.
通常不出现这个错误。这是你的虚拟内存耗尽的标志。
-200, Unsupported type %s on line %d.
通常不出现这个错误.这表明预编译器生成了一些库(函数)不认得的东西.可能你运行的预编译器和当前库不兼容.
-201, Too many arguments line %d.
这意味着  Postgres 返回了比我们的匹配变量更多的参数.可能你漏了几个 INTO :var1,:var2-列表里的宿主变量.
-202, Too few arguments line %d.
这意味着  Postgres 返回了比我们的对应宿主变量要少的参数.可能你多输入了几个 INTO :var1,:var2-列表里的宿主变量.
-203, Too many matches line %d.
这意味着查询返回了多个行,但你声明的变量不是数组.你执行的 SELECT 可能不是唯一的.
-204, Not correctly formatted int type: %s line %d.
这意味着宿主变量是一个  int 类型并且  Postgres 数据库里的字段是另一种类型,包含着一个不能转换成一个  int 类型的数值.库(函数)使用 strtol 做此类转换.
-205, Not correctly formatted unsigned type: %s line %d.
这意味着宿主变量是一个  unsigned int(无符号整数)类型而 Postgres 数据库里的字段是另外一种类型并且包含一个不能转换成 unsigned int 的数值.库(函数)使用 strtoul 做这类转换.
-206, Not correctly formatted floating point type: %s line %d.
这意味着宿主变量是一个  float (浮点)类型而  Postgres 数据库里的字段是另外一种类型并且包含一个不能转换成 float 的数值.库(函数)使用 strtod 做这类转换.
-207, Unable to convert %s to bool on line %d.
这意味着宿主变量是一个  bool (布尔)类型,而  Postgres 数据库里的字段值既不是 't' 也不是 'f'。
-208, Empty query line %d.
Postgres 返回 PGRES_EMPTY_QUERY,可能的原因是该查询实际上是空的。
-220, No such connection %s in line %d.
程序试图访问一个不存在的联接。
-221, Not connected in line %d.
程序试图访问一个存在的,但是没有打开的联接。
-230, Invalid statement name %s in line %d.
你试图使用的语句还没准备好。
-400, Postgres error: %s line %d.
某种  Postgres 错误。该消息包含来自  Postgres 后端的信息。
-401, Error in transaction processing line %d.
Postgres 给我们的信号,表明我们无法开始,提交或者回卷该事务。
-402, connect: could not open database %s.
与数据库的联接无法工作。
100, Data not found line %d.              这是一个"正常的"错误,告诉你你正在查询的东西找不到或者我们已经越过了游标的范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值