2017-06-30 11 views
0

一時表をターゲット表に追加し、where句でその列を使用して、1つの表に対して使用しているストアド・プロシージャを使用して親表に新しいデータを挿入しようとしています。親テーブルから目標テーブルへの1対1の関係(以下のコードを参照)。 alter table add column文でエラーが発生し、IMPORT_NUMBERが無効な識別子になります。どんな助けでも大歓迎です。oracleにストアド・プロシージャを挿入するための一時列を追加する

EXECUTE IMMEDIATE 
'ALTER TABLE TARGET_TABLE ADD IMPORT_NUMBER NUMBER'; 

INSERT 
INTO 
TARGET_TABLE(
existing_col_1, 
existing_col_2, 
existing_col_3, 
IMPORT_NUMBER 
) 
SELECT 
STAGED_TABLE.value1, 
STAGED_TABLE.value2, 
STAGED_TABLE.value3, 
STAGED_TABLE.IMPORT_NUMBER 
FROM 
STAGED_TABLE 
GROUP BY 
IMPORT_NUMBER; 

UPDATE 
PARENT_TABLE 
SET 
target_table_id =(
SELECT 
TARGET_TABLE.id 
FROM 
TARGET_TABLE 
WHERE 
TARGET_TABLE.IMPORT_NUMBER = PARENT_TABLE.IMPORT_NUMBER 
) 
WHERE 
PARENT_TABLE.IMPORT_NUMBER IS NOT NULL; 

EXECUTE IMMEDIATE 'ALTER TABLE TARGET_TABLE DROP COLUMN IMPORT NUMBER'; 
+0

削除カラムではなく失敗している追加カラムは本当ですか? "NUMBER"データ型としてのドロップカラム。そこには存在してはいけません。 4つの値を選択していますが、1でグループ化するだけなので、INSERTのSELECT部分​​も失敗します。 – Craig

+0

...またはその位置のNUMBERがデータ型ではありません。アンダースコアはありません。 DROP COLUMN IMPORT_NUMBERである必要があります。 – mathguy

答えて

2

このストアドプロシージャの場合、全体の手順はcreate or replace procedure時に解析され検証されます。プロシージャの作成時に列IMPORT_NUMBERが存在しないため、挿入文と更新文を検証できません。

可能であれば、DDLを含まないソリューションを見つけようとします。列をテーブルの永久的な部分にすることはできますか?

このパスに従う必要がある場合は、挿入および更新ステートメントを文字列にしてexecute immediateまたはDBMS_SQLに渡す必要があります。これにより、列が作成された後に実行時に解析および検証されます。

+0

これは意味があります。ありがとうございました! – Matt

関連する問題