Oracle 选择进入和多个变量进行更新

Oracle 选择进入和多个变量进行更新,oracle,plsql,oracle-sqldeveloper,Oracle,Plsql,Oracle Sqldeveloper,我是Oracle和PL/SQL的新手;我在选择几个变量时遇到了一些问题。我试图做的是在一个表中搜索多个项目(SA_SPECIFICATION_DETAILS),并将它们连接到另一个表(SA_ASSET)中的一个字段中。SA_SPECIFICATION_DETAILS表为每个SA_ASSET.ASSET_ID保存了几行属性。我已经为此工作了几天,但不断出现一些错误。以下是我的示例代码: DECLARE manuf VARCHAR(50); mods VARCHAR(50); mvs VARCHA

我是Oracle和PL/SQL的新手;我在选择几个变量时遇到了一些问题。我试图做的是在一个表中搜索多个项目(SA_SPECIFICATION_DETAILS),并将它们连接到另一个表(SA_ASSET)中的一个字段中。SA_SPECIFICATION_DETAILS表为每个SA_ASSET.ASSET_ID保存了几行属性。我已经为此工作了几天,但不断出现一些错误。以下是我的示例代码:

DECLARE 
manuf VARCHAR(50);
mods VARCHAR(50);
mvs VARCHAR(50);
yeara VARCHAR(4);
assid VARCHAR(50):= &assid;

BEGIN
SELECT TRIM(ATTRIBUTE_VALUE) INTO manuf      
    FROM
      SA_SPECIFICATION_DETAILS d,
      SA_ASSET a
    WHERE
      d.SPECIFICATION_NO = a.SPECIFICATION_NO
    AND d.ATTRIBUTE_DESC = 'MANUFACTURER'
    AND ASSET_ID = assid;

SELECT TRIM(ATTRIBUTE_VALUE) INTO mods
    FROM
      SA_SPECIFICATION_DETAILS d,
      SA_ASSET a
    WHERE
      d.SPECIFICATION_NO = a.SPECIFICATION_NO
    AND d.ATTRIBUTE_DESC = 'MODEL'
    AND ASSET_ID = assid;

SELECT TRIM(ATTRIBUTE_VALUE) INTO mvs
    FROM
      SA_SPECIFICATION_DETAILS d,
      SA_ASSET a
   WHERE
      d.SPECIFICATION_NO = a.SPECIFICATION_NO
    AND d.ATTRIBUTE_DESC = 'MAIN VALVE SIZE'
    AND ASSET_ID = assid;

SELECT TRIM(ATTRIBUTE_VALUE) INTO yeara
    FROM
      SA_SPECIFICATION_DETAILS d,
      SA_ASSET a
    WHERE
      d.SPECIFICATION_NO = a.SPECIFICATION_NO
    AND d.ATTRIBUTE_DESC = 'YEAR MANUFACTURED'
    AND ASSET_ID = assid;

dbms_output.ENABLE(buffer_size => NULL);
DBMS_OUTPUT.PUT_LINE ('Variables:');
dbms_output.put_line (manuf);
dbms_output.put_line (mods);
dbms_output.put_line (mvs);
dbms_output.put_line (yeara);
dbms_output.put_line (assid);
END;

BEGIN
UPDATE
  SA_ASSET
SET
  ASSET_DESC = TRIM(ATTRIBUTE1)
  || ' - Service Type: PW, Manf: '
  || manuf
  || ', Model: '
  || mods
  || ', Main Valve Size: '
  || mvs
  || ', Year Manf: '
  || yearm
  || ', Location: '
  || TRIM(SA_ASSET.STREET_NUMBER_CHAR)
  || ' '
  || TRIM(SA_ASSET.STREET_NAME)
WHERE
  ASSET_TYPE     = 'HYDRANT'
AND ASSET_STATUS = 'ACTIVE'
AND UPPER(ASSET_DESC) NOT LIKE '%LOCATION:%'
AND UPPER(ASSET_DESC) NOT LIKE '%HYDRANT%'
AND SA_ASSET.ASSET_ID = assid
END;
我已经对此进行了测试,但失败的原因是: 错误报告: ORA-06550:第73行第1列: PLS-00103:遇到符号“开始” ORA-06550:第96行第1列: PLS-00103:在预期以下情况时遇到符号“结束”:

因此,我对更新部分进行了注释,并尝试了以下方法:

    declare 
    manuf sa_specification_details.attribute_value%type;
    mods sa_specification_details.attribute_value%type;
    mvs sa_specification_details.attribute_value%type;
    yeara sa_specification_details.attribute_value%type;
    assid varchar2(15):= &assid;

    --dbms_output.ENABLE(buffer_size => NULL);

    BEGIN
    SELECT ATTRIBUTE_VALUE INTO manuf      
        FROM
          SA_SPECIFICATION_DETAILS d,
          SA_ASSET a
        WHERE
          d.SPECIFICATION_NO = a.SPECIFICATION_NO
        AND d.ATTRIBUTE_DESC = 'MANUFACTURER'
        AND ASSET_ID = assid;
    dbms_output.put_line (manuf);

   SELECT ATTRIBUTE_VALUE INTO mods
        FROM
          SA_SPECIFICATION_DETAILS d,
          SA_ASSET a
        WHERE
          d.SPECIFICATION_NO = a.SPECIFICATION_NO
        AND d.ATTRIBUTE_DESC = 'MODEL'
        AND ASSET_ID = assid;
    dbms_output.put_line (mods);

    SELECT ATTRIBUTE_VALUE INTO mvs
        FROM
          SA_SPECIFICATION_DETAILS d,
          SA_ASSET a
       WHERE
          d.SPECIFICATION_NO = a.SPECIFICATION_NO
        AND d.ATTRIBUTE_DESC = 'MAIN VALVE SIZE'
        AND ASSET_ID = assid;
    dbms_output.put_line (mvs);

    SELECT ATTRIBUTE_VALUE INTO yeara
        FROM
          SA_SPECIFICATION_DETAILS d,
          SA_ASSET a
        WHERE
          d.SPECIFICATION_NO = a.SPECIFICATION_NO
        AND d.ATTRIBUTE_DESC = 'YEAR MANUFACTURED'
        AND ASSET_ID = assid;
    dbms_output.put_line (yeara);  

    SYS.dbms_output.ENABLE;
    DBMS_OUTPUT.PUT_LINE ('Variables:');
    dbms_output.put_line (manuf);
    dbms_output.put_line (mods);
    dbms_output.put_line (mvs);
    dbms_output.put_line (yeara);
    dbms_output.put_line (assid); 
    END;
这让我知道了错误: 错误报告: ORA-01403:未找到任何数据 ORA-06512:第11行 140300000-“未找到任何数据” *原因:
*行动:

因此,我在没有选择的情况下运行了查询:

SELECT
  ATTRIBUTE_VALUE
FROM
  SA_SPECIFICATION_DETAILS d,
  SA_ASSET a
WHERE
  d.SPECIFICATION_NO = a.SPECIFICATION_NO
AND d.attribute_desc = 'MANUFACTURER'
AND asset_id = '001722';

并且它返回一个单行/单列(也就是说它可以工作)。那么我做错了什么?我已经声明了变量,我已经正确运行了selects,但是它没有传递变量(我可以看出-还没有dbms_output.put_line(manuf);工作)。我是接近还是完全走错了方向?

在代码中,您需要在此处添加单引号:

assid VARCHAR2(50):= '&assid';
同时在此处删除结束/开始:

dbms_output.put_line (assid);
END;

BEGIN
当您希望将其作为一个块时(当您使用更新中第一次选择的变量时)

最后我想你是说这是一年而不是一年

  || ', Year Manf: '
  || yearm <-- yeara?

:可能是您的一个查询未返回数据,这就是为什么它会给您
未找到任何数据
异常。请首先执行异常处理。然后检查通过资产ID检查的所有查询是否符合
型号、主阀尺寸、制造年份
too@robartle注意:不要使用
VARCHAR
,使用
VARCHAR2
。太棒了!工作完美!是的,“yearm”是一个拼写错误,但我认为阿西德的引语是拼图中缺失的部分。开始、结束可能是我测试的产物——我已经做了很多次了,我已经忘记了。谢谢你的帮助!是的,我在我的一次迭代中更改了它-忘记将其更改回来了。谢谢
select max(case d.attribute_desc
             when 'MANUFACTURER' then trim(attribute_value)
           end) manuf,
       max(case d.attribute_desc
             when 'MODEL' then trim(attribute_value)
           end) mods,
       max(case d.attribute_desc
             when 'MAIN VALVE SIZE' then trim(attribute_value)
           end) mvs,
       max(case d.attribute_desc
             when 'YEAR MANUFACTURED' then trim(attribute_value)
           end) yeara
  into manuf, mods, mvs, yeara
  from sa_specification_details d,
       sa_asset a
 where d.specification_no = a.specification_no
   and d.attribute_desc in ( 'MANUFACTURER', 'MODEL', 'MAIN VALVE SIZE',
                             'YEAR MANUFACTURED' )
   and asset_id = assid;