2012-01-09 67 views
2

我有這樣的SQL:SQL變量,怎麼做?

DROP TABLE MISSINGTABLE; 

CREATE TABLE MISSINGTABLE (
    TABLE_NAME VARCHAR2 (70), 
    DESCRIPTION VARCHAR2 (1000) 
) 

CREATE OR REPLACE PROCEDURE MISSINGTABLES AS 
    BEGIN 
     INSERT INTO MISSINGTABLE 
     ((((SELECT TABLE_NAME, 'Missing Table on PEKA_ERP_001' Description FROM ALL_TABLES WHERE OWNER = 'ASE_ERP_001') 
     MINUS 
     (SELECT TABLE_NAME, 'Missing Table on PEKA_ERP_001' Description FROM ALL_TABLES WHERE OWNER = 'PEKA_ERP_001')) 
     UNION 
     ((SELECT TABLE_NAME, 'Missing Table on ASE_ERP_001' Description FROM ALL_TABLES WHERE OWNER = 'PEKA_ERP_001') 
     MINUS 
     (SELECT TABLE_NAME, 'Missing Table on ASE_ERP_001' Description FROM ALL_TABLES WHERE OWNER = 'ASE_ERP_001')))); 
    END; 

那麼,如何ü可以看到,我創建一個表,然後一個過程,它填補了表。 現在我想2這些參數變量:'PEKA_ERP_001''ASE_ERP_001'(所以我並不總是需要將它手動編寫,因爲這個數值變化很大)

我想這(僅包括第一部分上述聲明):

DECLARE 
    S1 VARCHAR2(100) := 'ASE_ERP_001'; 
    S2 VARCHAR2(100) := 'PEKA_ERP_001'; 
    TableMissing VARCHAR(100) := 'Missing Table on '; 
    Apostrophe VARCHAR(10) := ''''; 
    BEGIN 
     EXECUTE IMMEDIATE ('CREATE OR REPLACE PROCEDURE MISSINGTABLES AS BEGIN INSERT INTO MISSINGTABLE (SELECT TABLE_NAME, ' || Apostrophe || TableMissing || S2 || Apostrophe || ' Description FROM ALL_TAB_COLUMNS WHERE OWNER = ' || Apostrophe || S1 || Apostrophe || ')' || ' END;'); 
END; 

它創建的程序,但程序中包含了 「CREATE OR REPLACE PROCEDURE」 本身和它的顯示我的錯誤...(我不能執行程序)

任何人都可以幫助我嗎? 如何在頭部使用第一條SQL語句編寫第一條SQL語句,僅使用2個變量更多,ASE_ERP_001PEKA_ERP_001

編輯:

聲明:

DECLARE 
    S1 VARCHAR2(100) := 'ASE_ERP_001'; 
    S2 VARCHAR2(100) := 'PEKA_ERP_001'; 
    TabelleFehlt VARCHAR(100) := 'Diese Tabelle fehlt '; 
    Hochkomma VARCHAR(10) := ''''; 
    BEGIN 
     EXECUTE IMMEDIATE ('CREATE OR REPLACE PROCEDURE MISSINGTABLES AS BEGIN INSERT INTO MISSINGTABLE (SELECT TABLE_NAME, ' || Hochkomma || TabelleFehlt || S2 || Hochkomma || ' Beschreibung FROM ALL_TAB_COLUMNS WHERE OWNER = ' || Hochkomma || S1 || Hochkomma || ') END;'); 
END; 

上面的語句創建一個過程。 但同時也說明我:

ORA-06512: in Row 7 
    24344. 00000 - "success with compilation error" 
    *Cause: A sql/plsql compilation error occurred. 
    *Action: Return OCI_SUCCESS_WITH_INFO along with the error code 

和程序Itselfs包含此:

create or replace 
PROCEDURE MISSINGTABLES AS BEGIN INSERT INTO MISSINGTABLE (SELECT TABLE_NAME, 'Diese Tabelle fehlt PEKA_ERP_001' Beschreibung FROM ALL_TAB_COLUMNS WHERE OWNER = 'ASE_ERP_001') END; 

但它不應該包含「創建或替換過程MISSINGTABLES」等只INSERT語句,我不能無論如何執行程序..

更好的是使用bpgergo腳本,如果它會去。

+0

什麼是這裏的商業邏輯?你爲什麼動態創建一個過程。爲什麼不創建一個靜態過程,只是調整變量的值? – APC 2012-01-09 13:05:41

回答

4

我希望我沒有混合參數,你應該檢查他們再次

CREATE OR REPLACE PROCEDURE MISSINGTABLES (p_1 in varchar2, p_2 in varchar2) 
AS 
    BEGIN 
     INSERT INTO MISSINGTABLE 
     ((((SELECT TABLE_NAME, 'Missing Table on '||p_1 Description FROM ALL_TABLES WHERE OWNER = p_2) 
     MINUS 
     (SELECT TABLE_NAME, 'Missing Table on '||p_1 Description FROM ALL_TABLES WHERE OWNER = p_1)) 
     UNION 
     ((SELECT TABLE_NAME, 'Missing Table on '||p_2 Description FROM ALL_TABLES WHERE OWNER = p_1) 
     MINUS 
     (SELECT TABLE_NAME, 'Missing Table on '||p_2 Description FROM ALL_TABLES WHERE OWNER = p_2)))); 
END; 

編輯

你會調用此類似:

begin 
    MISSINGTABLES ('PEKA_ERP_001', 'ASE_ERP_001'); 
end; 
+0

感謝您的回答!我只是試過了,但是我得到了這個ErrorMessage:'PLS-00201:'MISSINGTABLES'必須聲明爲 PL/SQL:語句被忽略 06550. 00000 - 「行%s,列%s:\ n%s」 *原因:通常是PL/SQL編譯錯誤。 *操作:' – eMi 2012-01-09 10:35:49

+0

eMi,您必須在調用它之前定義您的過程。你在調用它之前是否成功運行過「創建或替換過程錯誤表」? – bpgergo 2012-01-09 10:57:50

+0

現在我得到了這個ErrorMessage:'ORA-06550:行4,列1: PLS-00103:找到符號「創建」 06550. 00000 - 「行%s,列%s:\ n%s」 *原因:通常是PL/SQL編譯錯誤。 *操作:' – eMi 2012-01-09 11:09:25

1

的SQL你正試圖立即執行將被評估爲:

CREATE OR REPLACE PROCEDURE MISSINGTABLES AS 
BEGIN 
INSERT INTO MISSINGTABLE 
(SELECT TABLE_NAME, COLUMN_NAME, 'Missing Table on PEKA_ERP_001' Beschreibung 
FROM ALL_TAB_COLUMNS WHERE OWNER = 'ASE_ERP_001') 
END; 

這可能不是您實際需要的邏輯,但直接的問題是您正在嘗試填充名爲Beschreibung的不存在的第三列,而不是填充第二列DESCRIPTION

+0

這不是問題,我只是改變了腳本的語言,因爲德語上有一切。在我的工作區中,一切正常,現在我只是將其更改爲描述 – eMi 2012-01-09 10:31:38

+0

@eMi:您錯誤地理解了問題的本質 - 您的代碼有三個**列,但MISSINGTABLE有兩個**列。它是導致錯誤的多餘的額外列(在您的代碼中稱爲「COLUMN_NAME」)。 – 2012-01-09 10:35:01

+0

哦,是的,很好看!我刪除它,但它仍然不工作:(它創建過程,但在該過程中我再次整個代碼(「創建或替換 程序MISSINGTABLES開始插入失蹤(SELECT TABLE_NAME ...」) – eMi 2012-01-09 10:45:40

1

可能我建議改進您的SELECT?

這裏是一個可能的選擇:

SELECT 
    TABLE_NAME, 
    'Missing Table on' 
    || CASE MAX(OWNER) WHEN 'PEKA_ERP_001' THEN 'ASE_ERP_001' ELSE 'PEKA_ERP_001' END 
    AS Description 
FROM ALL_TABLES 
WHERE OWNER IN ('PEKA_ERP_001', 'ASE_ERP_001') 
GROUP BY TABLE_NAME 
HAVING COUNT(*) = 1 

此查詢只返回行,其中一個TABLE_NAME只有一個OWNER。然後顯示缺少表格的所有者作爲被測試的兩個中的另一個。

使用參數,整個CREATE PROCEDURE聲明可能是這樣的:

CREATE OR REPLACE PROCEDURE MISSINGTABLES 
(
    owner1 IN varchar2, 
    owner2 IN varchar2 
) 
AS 
BEGIN 
    INSERT INTO MISSINGTABLE 
    (
    SELECT 
    TABLE_NAME, 
    'Missing Table on' 
    || CASE MAX(OWNER) WHEN owner1 THEN owner2 ELSE owner1 END 
    AS Description 
    FROM ALL_TABLES 
    WHERE OWNER IN (owner1, owner2) 
    GROUP BY TABLE_NAME 
    HAVING COUNT(*) = 1 
); 
END; 
+0

+1利用時間,幫助我:D – eMi 2012-01-09 14:12:57