You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PL/SQL字符串模式执行查询报错,多列结果存储至输出变量求助

问题修复方案

核心错误分析

  1. 动态SQL语法错误:拼接SQL时,select后的列名与into子句之间缺少空格,导致SQL语句格式非法,触发“缺失表达式”错误。
  2. 结果接收变量不匹配:查询返回6列数据,但用单个变量test接收,类型和数量均不匹配,无法正确存储结果。
  3. SQL注入风险:直接拼接参数到SQL字符串中,不仅存在安全隐患,还可能因参数含特殊字符(如单引号)引发语法错误。

修复后的存储过程代码

procedure getAttributeOptions(subID number, compID number, docNumber varchar2, transType varchar2, rowNum varchar2,
          Attribute1 out varchar2, Attribute2 out varchar2, Attribute3 out varchar2, Attribute4 out varchar2,
          Attribute5 out varchar2, Attribute6 out varchar2) is
sqlQuery varchar2(4000);
colName varchar2(1000);
tableName varchar2(1000);
primaryKey varchar2(1000);

begin
 colName := 'ATTRIBUTE_OPTION_1,ATTRIBUTE_OPTION_2,ATTRIBUTE_OPTION_3,ATTRIBUTE_OPTION_4,ATTRIBUTE_OPTION_5,ATTRIBUTE_OPTION_6';

  if transType = TY_ISSUE then
    tableName := 'preq_master_detail';
    primaryKey := 'req_number';
  elsif transType = TY_TRANSFER then 
     tableName := 'pinv_transfer_detail'; 
     primaryKey := 'transfer_id';
  elsif transType = TY_RECEIVE then 
    tableName := 'ppo_master_detail';
    primaryKey := 'po_number';
  elsif transType = TY_MANUAL then 
    tableName := 'part_manual_adjustment';
    primaryKey := 'adjustment_id';
  end if;
  
  dbms_output.put_line(tableName);
  
  if tableName is not null then
    begin
      -- 修正SQL语法,添加必要空格,使用绑定变量避免注入和语法错误
      sqlQuery := 'select ' || colName || ' from ' || tableName 
                || ' where subscriber_id = :1'
                || ' and company_id = :2'
                || ' and ' || primaryKey || ' = :3'
                || ' and row_number = :4';
      
      dbms_output.put_line(sqlQuery); 
      -- 直接将查询结果存入对应的输出变量,数量和类型匹配
      execute immediate sqlQuery into Attribute1, Attribute2, Attribute3, Attribute4, Attribute5, Attribute6
        using subID, compID, docNumber, rowNum;
      
      dbms_output.put_line(Attribute1); 
      dbms_output.put_line(Attribute2); 
      dbms_output.put_line(Attribute3); 
      dbms_output.put_line(Attribute4); 
      dbms_output.put_line(Attribute5); 
      dbms_output.put_line(Attribute6); 
      
    exception 
      when NO_DATA_FOUND then return;
      when others then 
        dbms_output.put_line('Error: ' || sqlerrm);
        raise;
    end; 
  end if;
end;

关键修改点

  • 修正SQL语法:移除多余的storageColumns变量,确保select、列名、from之间有正确空格,避免语法解析失败。
  • 匹配结果接收变量:将6个输出变量直接作为execute immediate的into目标,与查询返回的6列一一对应。
  • 使用绑定变量:用:1、:2等占位符替代直接拼接参数,通过using子句传入参数,避免SQL注入,同时解决参数含特殊字符的语法问题。
  • 简化代码:删除无用的test和storageColumns变量,精简逻辑。

内容的提问来源于stack exchange,提问作者rishabh tripathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:15:33