ORA-01008未绑定所有变量 PL/SQL动态SQL执行报错排查求助
ORA-01008错误原因及修复方案
核心错误点
- 绑定变量数量不匹配:你的动态SQL语句中,
ad_no对应的绑定变量:2共出现了2次,但USING子句仅传入了1次ad_no。Oracle的EXECUTE IMMEDIATE采用按位置绑定规则,不会对相同名称的绑定变量去重,占位符出现多少次就需要传入多少次对应值,你当前语句共有3个绑定变量占位符(:11次、:22次),但仅传入2个值,因此触发变量未全部绑定的报错。 - 逻辑隐藏错误:绑定变量不能用于传递列名、表名这类Schema对象标识符。你写的
SELECT :1会把传入的col_id当做字符串常量返回,而非查询col_id对应列的实际值,不符合业务预期。
修复方案
把列名也通过REPLACE替换到动态SQL中,不需要用绑定变量传递,再补齐绑定变量的传参即可,修正后代码如下:
DECLARE form_name VARCHAR2(225) := 'MUST AS'; ad_no VARCHAR2(225) := :ad_no; sql_stmt VARCHAR2(4000); sql_output VARCHAR2(4000); db_table VARCHAR(225) := inp_reminder_pkg.form_db_table(form_name); col_id VARCHAR(225) := inp_reminder_pkg.get_col_id(form_name); BEGIN sql_stmt := ' SELECT #colId FROM @tableName WHERE advno = :1 AND created = ( SELECT MAX(CREATED) FROM @tableName WHERE advno = :1 )' ; -- 替换表名和列名 sql_stmt := replace(sql_stmt, '@tableName', db_table); sql_stmt := replace(sql_stmt, '#colId', col_id); -- 绑定变量出现2次,传入2次ad_no EXECUTE IMMEDIATE sql_stmt INTO sql_output USING ad_no, ad_no; dbms_output.put_line(sql_output); EXCEPTION WHEN no_data_found THEN dbms_output.put_line('no-data'); END;
内容的提问来源于stack exchange,提问作者ebbie
相关产品推荐
相关产品推荐

