2017-04-12 18 views
0

我在變量中有一個select語句。我需要將此select語句的所有行輸出插入到另一個表中。我正試圖在一個程序中實現這一點。 請幫幫我。 我的代碼如下所示:執行插入查詢過程中的變量

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;'; 

我需要這個選擇查詢的輸出插入表ERR_DUP_CHK。我正嘗試像

execute immediate 'INSERT INTO UTI_ERR_DUP_CHK SQL_STMT3'; 

執行此但它不是executing.Please幫助我。

+1

你會得到什麼錯誤信息?或者它只是掛起?或者返回錯誤的輸出? – z32a7ul

回答

1

與你在做什麼,眼前的問題是,你將需要連接你已經建立起來的SELECT語句,不包括它的變量名作爲另一種文字的一部分:

execute immediate 'INSERT INTO UTI_ERR_DUP_CHK ' || SQL_STMT3; 

您還需要去除分號動態語句中 - 這是什麼造成的ORA-00911錯誤:不少雖然

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

您可以簡化整個過程,例如,到:

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

@亞歷克斯 - 它的工作方式很神奇。非常感謝 –