【openGauss/MogDB】SQLCODE竟然不是数值类型?
前言
在openGauss/MogDB中,有一条这样的规则
兼容O模式下,SQLCODE等于SQLSTATE
原生PG中,SQLCODE是整型数值,SQLSTATE是5字符的字符串;ORACLE中的SQLCODE也是数值类型。
于是之前基于ORACLE或者基于PG的应用程序,在迁移到openGauss/MogDB后,如果使用数值型变量接收sqlcode,或者对sqlcode进行数值大小判断时,都会可能出现类似这样的报错
ERROR: invalid input syntax for integer: “22P02”
如果期望不丢失任何信息,将SQLCODE存下来,要么改应用程序的相关数据模型或者代码,改成用字符类型来存SQLCODE,要么就只能通过一种算法,将SQLCODE转成数值,并且需要能还原回原本的字符串。
内核源码分析
在openGauss源码中,可以找到这样一段代码
if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT) {
assign_text_var(sqlcode_var, plpgsql_get_sqlstate(prev_error->sqlerrcode));
} else {
sqlcode_var->value = Int32GetDatum(prev_error->sqlerrcode);
sqlcode_var->freeval = false;
sqlcode_var->isnull = false;
}