CodeIgniter3调用Oracle带REF CURSOR存储过程返回空数组问题排查
结合你提供的代码和已知存储过程本身运行正常的情况,以下是几个可能的原因及排查方向:
参数类型与长度不匹配:你绑定
nummonth和numyear时指定了长度32,但如果存储过程中这两个参数是数字类型(如NUMBER),默认以字符串类型绑定可能导致参数值被错误解析,使得存储过程内的查询条件无法匹配数据,最终返回空结果。可以尝试调整绑定方式,指定正确的参数类型:oci_bind_by_name($smt, ":nummonth", $nummonth, -1, OCI_B_INT); oci_bind_by_name($smt, ":numyear", $numyear, -1, OCI_B_INT);存储过程参数顺序不匹配:仔细核对存储过程
FRGSV006_SCP60_COMPACT的定义,确认参数顺序是否为(cur OUT SYS_REFCURSOR, nummonth IN ..., numyear IN ...)。如果存储过程实际参数顺序是(nummonth IN, numyear IN, cur OUT),那么你在BEGIN块中的参数顺序完全颠倒,会导致游标无法被正确赋值,自然返回空数组。游标读取方式的问题:尝试替换
oci_fetch_all为逐行读取的方式,排查是否是该函数的参数设置导致无法获取数据:$result = []; while ($row = oci_fetch_array($refcur, OCI_ASSOC + OCI_RETURN_NULLS)) { $result[] = $row; }数据库用户权限差异:确认PHP代码使用的数据库用户,是否拥有执行
FRGSV006_SCP60_COMPACT存储过程的权限,以及存储过程中查询的所有关联表的访问权限。即使你用其他用户测试存储过程正常,PHP的用户可能因权限不足导致查询无结果。连接环境不一致:检查PHP连接的Oracle数据库实例,是否和你测试存储过程的实例是同一个。如果是不同环境(如测试库 vs 生产库),可能目标环境中没有符合
nummonth和numyear条件的数据。
内容的提问来源于stack exchange,提问作者rasty

