私はOracleとPL/SQLの新人です。いくつかの変数への選択に関していくつかの問題があります。私がやろうとしているのは、1つのテーブル(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:シンボル "BEGIN"に遭遇しましたORA-06550:行96、列1:PLS-00103:シンボルに遭遇しました次のいずれかが予想される場合は「END」:
だから私は更新部分をコメントアウトしてこれを試しました:
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行目01403。00000-「データが見つかりません」*原因:
*アクション:
だから私はselectなしでクエリを実行しました:
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';
そして、それは単一の行/単一の列を返します(別名それは機能します)。だから私は何が間違っているのですか?変数を宣言しました。正しく実行するためのselectがありますが、変数が渡されていません(dbms_output.put_line(manuf);が機能していないことがわかります)。私は完全に閉じていますか、それとも間違った方向に進んでいますか?