2012-01-09 33 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