2017-04-12 2 views
0

変数にselect文があります。このselect文のすべての行出力を別の表に挿入する必要があります。私はこれを手順で達成しようとしています。 私を助けてください。 のように私のコードに見える:私はテーブルERR_DUP_CHK .Iにこの選択クエリの出力を挿入する必要がexecuteプロシージャの変数に問合せを挿入します。

CREATE OR REPLACE 
PROCEDURE PRC_DUP_CHK(
V_IN_TABLE_NAME IN VARCHAR2, 
V_SOURCE_FILE IN VARCHAR2, 
v_col   IN VARCHAR2, 
) 
AS 

SQL_STMT  VARCHAR2(20000); 
SQL_STMT3  VARCHAR2(20000); 
V_KEY_COL_LIST VARCHAR2(500); 
V_KEY_COL_LIST1 VARCHAR2(500); 
BEGIN 

SELECT UDC_KEY_COLUMNS INTO V_KEY_COL_LIST FROM UTI_DUP_CHK WHERE 
UDC_TABLE_NAME=''||V_IN_TABLE_NAME||''; 
SELECT REPLACE(V_KEY_COL_LIST,',','||''~''||') INTO V_KEY_COL_LIST1 FROM 
DUAL; 

SQL_STMT :='SELECT REPLACE(UDC_KEY_COLUMNS,'','',''~'') 
FROM UTI_DUP_CHK WHERE UDC_TABLE_NAME='''||V_IN_TABLE_NAME||''''; 

SQL_STMT3:='SELECT ('||SQL_STMT||') KEY_COLUMNS, 
'||V_KEY_COL_LIST1||' KEY_VALUES, 
'''||V_IN_TABLE_NAME||''''||' ODS_TABLE, 
'''||V_SOURCE_FILE||''''||' SOURCE_FILE, 
TO_CHAR(SYSDATE,''DD-Mon-YYYY HH:MI:SS AM'') LOAD_TIME 
FROM (
SELECT DISTINCT '||V_KEY_COL_LIST||',COUNT(*) CNT 
FROM '||V_IN_TABLE_NAME||''|| ' WHERE '||V_COL||'>SYSDATE 
GROUP BY '||V_KEY_COL_LIST||')A 
WHERE A.CNT=1;'; 

execute immediate 'INSERT INTO UTI_ERR_DUP_CHK SQL_STMT3'; 

のようにこれを実行しようとしています。しかし、それが助けをexecuting.Pleaseされていません私。あなたはまた、必要

execute immediate 'INSERT INTO UTI_ERR_DUP_CHK ' || SQL_STMT3; 

+1

どのようなエラーメッセージが表示されますか?それともちょうどハングアップしますか?または、間違った出力を返しますか? – z32a7ul

答えて

1

何をやっているとの当面の問題は、あなたが、別のリテラルの一部としてその変数名が含まれていないあなたが築き上げてきたselect文を連結する必要があるだろうということです動的ステートメント内のセミコロンを削除する - それは、ORA-00911エラーを引き起こしているものです:

... 
WHERE A.CNT=1'; -- no semicolon inside the string 

あなたは、かなりかかわらず、例えば全体の手順を簡略化することができto:

CREATE OR REPLACE PROCEDURE PRC_DUP_CHK (
    V_TABLE_NAME IN VARCHAR2, 
    V_SOURCE_FILE IN VARCHAR2, 
    v_COL   IN VARCHAR2 
) 
AS 
    L_SQL_STMT  VARCHAR2(32767); 
BEGIN 
    SELECT 'SELECT ''' || REPLACE(UDC_KEY_COLUMNS, ',', '~') || ''', 
     ' || REPLACE(UDC_KEY_COLUMNS, ',', '||''~''||') || ', 
     :V_TABLE_NAME, 
     :SOURCE_FILE, 
     TO_CHAR(SYSDATE, ''DD-Mon-YYYY HH:MI:SS AM'') LOAD_TIME 
    FROM ' || V_TABLE_NAME || ' WHERE ' || V_COL || ' > SYSDATE 
    GROUP BY ' || UDC_KEY_COLUMNS || ' 
    HAVING COUNT(*) = 1' 
    INTO L_SQL_STMT 
    FROM UTI_DUP_CHK 
    WHERE UDC_TABLE_NAME = V_TABLE_NAME; 

    execute immediate 'INSERT INTO UTI_ERR_DUP_CHK ' || L_SQL_STMT 
    using V_TABLE_NAME, V_SOURCE_FILE; 
END PRC_DUP_CHK; 
/

おそらく挿入にターゲット表の列名を含めるべきです。また、そのターゲット表に日付をストリングとして保管することを再検討することもできます。

+0

エラー:ORA-00911:無効な文字 –

+0

@ PavaniSrujana - 作成している文字列の中に、動的クエリの最後にセミコロンがあります。 ORA-00911エラーが発生しています。 –

+0

@アレックス - それは魔法のように働いた。 –

関連する問題