首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库中 CALL PL报错 prepare sql is not a string(result={"NULL":"NULL"}, ret=-4016 的原因和解决方法
更新时间:2026-05-29 08:46
问题现象
OceanBase 数据库中 CALL PL 报错 prepare sql is not a string(result={"NULL":"NULL"}, ret=-4016)。
关键日志信息:
[2024-09-23 15:27:27.721604] WARN [SQL.ENG] execute (ob_prepare_executor.cpp:76) [763646][0][xxxxx-xxxxx-xxxxx-xxxxx] [lt=10] [dc=0] prepare sql is not a string(result={"NULL":"NULL"}, ret=-4016)
部分 PL 脚本:
-- 检查入库信息
SET V_SQL =CONCAT('
SELECT COUNT(*) INTO @V_CNT_G FROM (
SELECT CNT from (SELECT 1 CNT FROM TEMP_SR_ZYTB_TOZQ_EXCEL_BF_SRDD WHERE ACCTE_DATE=''',V_ACCTE_DATE,''' LIMIT 1) A
UNION ALL
SELECT CNT from (SELECT 1 CNT FROM DWD_D_PRD_CB_USER_QX WHERE month_id=''',V_MONTH,''' and day_id=''',V_DAY,''' LIMIT 1)B
UNION ALL
SELECT CNT from (SELECT 1 CNT FROM DIM_D_RES_CARD_OFFICE WHERE month_id=''',V_MONTH_HD,''' and day_id=''',V_DAY_HD,''' LIMIT 1)c) t');
select V_SQL;
set @sql = V_SQL;
PREPARE stmt FROM @sql;
EXECUTE stmt; -- 执行SQL语句
select concat('@V_CNT_G=',@V_CNT_G);
DEALLOCATE PREPARE stmt;
SQL_AUDIT 记录:
MySQL [oceanbase]> SELECT * FROM v$SQL_AUDIT WHERE QUERY_SQL LIKE '%CALL XXxxx%' ORDER BY REQUEST_TIME DESC;
输出结果如下:
+----------------+----------+------------+-------------+-----------------------------------+------------+----------------+-------------+-----------+-------------+---------------------+------------------+-----------+------------+----------------+----------------------+---------+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------+-------------+---------------+----------+-------+--------+--------+-----------+----------------------+--------+------+--------+------+--------+----+-------+---------------+-------------+------------+--------------------+-----------------+-----------------------+-------------+-----------+-----------+--------------+-----------------+-------------+------------------+--------------+----------+---------------+------------+-------------+---------------+--------------+-----------------------+-----------------------+-------------------+---------------+---------------+------------------------+-----------------+-----------------------+------------+-----------+------------+-------------------+-------------------------+------------------------+---------------------+-----------------------+-------------------+------------+--------------------+-------------------+------------------+---------------------+--------------+-----------------------+---------------+-----------+--------------------+-----------------------+--------------+
| SVR_IP | SVR_PORT | REQUEST_ID | SQL_EXEC_ID | TRACE_ID | SID | CLIENT_IP | CLIENT_PORT | TENANT_ID | TENANT_NAME | EFFECTIVE_TENANT_ID | USER_ID | USER_NAME | USER_GROUP | USER_CLIENT_IP | DB_ID | DB_NAME | SQL_ID | QUERY_SQL | PLAN_ID | AFFECTED_ROWS | RETURN_ROWS | PARTITION_CNT | RET_CODE | QC_ID | DFO_ID | SQC_ID | WORKER_ID | EVENT | P1TEXT | P1 | P2TEXT | P2 | P3TEXT | P3 | LEVEL | WAIT_CLASS_ID | WAIT_CLASS# | WAIT_CLASS | STATE | WAIT_TIME_MICRO | TOTAL_WAIT_TIME_MICRO | TOTAL_WAITS | RPC_COUNT | PLAN_TYPE | IS_INNER_SQL | IS_EXECUTOR_RPC | IS_HIT_PLAN | REQUEST_TIME | ELAPSED_TIME | NET_TIME | NET_WAIT_TIME | QUEUE_TIME | DECODE_TIME | GET_PLAN_TIME | EXECUTE_TIME | APPLICATION_WAIT_TIME | CONCURRENCY_WAIT_TIME | USER_IO_WAIT_TIME | SCHEDULE_TIME | ROW_CACHE_HIT | BLOOM_FILTER_CACHE_HIT | BLOCK_CACHE_HIT | BLOCK_INDEX_CACHE_HIT | DISK_READS | RETRY_CNT | TABLE_SCAN | CONSISTENCY_LEVEL | MEMSTORE_READ_ROW_COUNT | SSSTORE_READ_ROW_COUNT | REQUEST_MEMORY_USED | EXPECTED_WORKER_COUNT | USED_WORKER_COUNT | SCHED_INFO | FUSE_ROW_CACHE_HIT | PS_CLIENT_STMT_ID | PS_INNER_STMT_ID | TRANSACTION_HASH | REQUEST_TYPE | IS_BATCHED_MULTI_STMT | OB_TRACE_INFO | PLAN_HASH | LOCK_FOR_READ_TIME | WAIT_TRX_MIGRATE_TIME | PARAMS_VALUE |
+----------------+----------+------------+-------------+-----------------------------------+------------+----------------+-------------+-----------+-------------+---------------------+------------------+-----------+------------+----------------+----------------------+---------+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------+-------------+---------------+----------+-------+--------+--------+-----------+----------------------+--------+------+--------+------+--------+----+-------+---------------+-------------+------------+--------------------+-----------------+-----------------------+-------------+-----------+-----------+--------------+-----------------+-------------+------------------+--------------+----------+---------------+------------+-------------+---------------+--------------+-----------------------+-----------------------+-------------------+---------------+---------------+------------------------+-----------------+-----------------------+------------+-----------+------------+-------------------+-------------------------+------------------------+---------------------+-----------------------+-------------------+------------+--------------------+-------------------+------------------+---------------------+--------------+-----------------------+---------------+-----------+--------------------+-----------------------+--------------+
| 10.*.*.194 | 2882 | 1217533192 | 1295693050 | YB420AAC92C2-00060F66BC0E519F-0-0 | 3224454907 | 10.xxx.xxx.164 | 43468 | 1001 | zbxxx_ob_bs | 1001 | 1100611139404777 | zb_xxx | 0 | 10.xxx.xxx.164 | 18446744073709551615 | | BFAF69D317E0330CB3F31386062114E9 | select * from v$sql_audit where query_sql like '%CALL zb_fqz.XXXXXXXXXXXXXXXXXXXXXXXXXX(20240923, 20240922, ?, ?)%' order by request_time desc | 0 | 0 | 0 | 0 | -5134 | 0 | 0 | 0 | 0 | system internal wait | | 0 | | 0 | | 0 | 0 | 100 | 0 | OTHER | MAX_WAIT TIME ZERO | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1727083223446003 | 511 | 0 | 0 | 23 | 0 | 432 | 39 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -1 | 0 | 0 | 2096128 | 0 | 0 | NULL | 0 | -1 | -1 | 0 | 2 | 0 | NULL | 0 | 0 | 0 | |
| 10.*.*.194 | 2882 | 1217527289 | 1295542529 | YB420AAC92C2-00060F66D7DD65FE-0-0 | 3224563175 | 10.xxx.xxx.164 | 54014 | 1001 | zbxxx_ob_bs | 1001 | 1100611139404777 | zb_xxx | 0 | 10.xxx.xxx.87 | 1100611139404827 | zb_fqz | 7AA1E104BDEC0E1CD9CB0F35BB4EBB24 | /* ApplicationName=DBeaver 24.0.2 - SQLEditor <Script-205.sql> */ CALL zb_fqz.XXXXXXXXXXXXXXXXXXXXXXXXXX(20240923, 20240922, @com_mysql_jdbc_outparam_V_RETCODE, @com_mysql_jdbc_outparam_V_RETINFO) | 0 | 0 | 0 | 0 | -4016 | 0 | 0 | 0 | 0 | sync rpc | pcode | 1308 | size | 1712 | | 0 | 0 | 107 | 7 | NETWORK | WAITED KNOWN TIME | 1350622 | 1380151 | 19 | 21 | 0 | 0 | 0 | 0 | 1727076445896384 | 1825862 | 0 | 0 | 32 | 2 | 661 | 1825144 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 0 | -1 | 0 | 0 | 4192256 | 0 | 0 | NULL | 0 | -1 | -1 | 1097682378722222551 | 2 | 0 | NULL | 0 | 0 | 0 | |
+----------------+----------+------------+-------------+-----------------------------------+------------+----------------+-------------+-----------+-------------+---------------------+------------------+-----------+------------+----------------+----------------------+---------+----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------+---------------+-------------+---------------+----------+-------+--------+--------+-----------+----------------------+--------+------+--------+------+--------+----+-------+---------------+-------------+------------+--------------------+-----------------+-----------------------+-------------+-----------+-----------+--------------+-----------------+-------------+------------------+--------------+----------+---------------+------------+-------------+---------------+--------------+-----------------------+-----------------------+-------------------+---------------+---------------+------------------------+-----------------+-----------------------+------------+-----------+------------+-------------------+-------------------------+------------------------+---------------------+-----------------------+-------------------+------------+--------------------+-------------------+------------------+---------------------+--------------+-----------------------+---------------+-----------+--------------------+-----------------------+--------------+
问题原因
原因为 PL 脚本里 V_SQL 写法不严谨,未保证结果不为 NULL,当其结果为 NULL 时,导致了 PL 执行失败,报错 prepare sql is not a string。
问题的风险及影响
PL 执行报错。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OceanBase 数据库 V3.x、V4.x 版本。
解决方法及规避方式
业务修改 PL 脚本。