SQL变量,怎么做?
我有一个SQL:SQL变量,怎么做?,sql,oracle,variables,Sql,Oracle,Variables,我有一个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 Tabl
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;
所以,你可以看到,我正在创建一个表,然后是一个过程,它填充了表。
现在我想为这些参数设置两个变量:'PEKA_ERP_001'
和'ASE_ERP_001'
(因此我不需要总是手动编写,因为这些值变化很大)
我试过这个(只包括上面陈述的第一部分):
它创建过程,但过程本身包含“创建或替换过程”及其向我显示错误。。。(我无法执行该过程)
有人能帮我吗我如何在开头编写第一条SQL语句,该语句只使用另外两个变量,ASE_ERP_001
和PEKA_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
程序本身包含以下内容:
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;
但是它不应该包含“Create or Replace Procedure MISSINGTABLES”等。只有INSERT语句,我无论如何都不能执行该过程
更好的办法是使用bpgergo的脚本,如果可以的话。我希望我没有混淆这些参数,您应该再次检查它们
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;
您尝试立即执行的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
我是否可以建议对您的选择进行改进
这里有一个可能的替代方案:
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
此查询仅返回表\u NAME
只有一个所有者的行。然后,缺少该表的所有者将显示为两个被测试者中的另一个
使用参数,整个CREATE过程
语句可能如下所示:
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;
这不是问题,我只是改变了剧本的语言,因为德语上什么都有。在我的工作区中,一切都是正确的,我只是现在将其更改为Description@eMi:您误解了问题的本质-您的代码有三列,但MISSINGTABLE有两列。是额外的列(在代码中称为column\u NAME
)导致了错误。哦,是的,注意了!我删除了它,但它仍然不起作用:(它创建了过程,但在过程中我又有了完整的代码(“创建或替换过程MISSINGTABLES AS BEGIN INSERT INTO MISSINGTABLE(选择TABLE_NAME…)@eMi:你能用你发布的整个comand更新这个问题吗?运行时它会生成什么,为什么这不是你想要的?谢谢你的回答!我刚刚尝试过,但我收到了错误消息:'PLS-00201:'MISSINGTABLES'必须声明为PL/SQL:Statement ignored 06550.00000-“第%s行,第%s列:\n%s”*原因:通常是PL/SQL编译错误。*操作:''eMi,在调用过程之前必须定义过程。在调用过程之前是否成功运行了CREATE或REPLACE-procedure-MISSINGTABLES
“第%s行,第%s列:\n%s”*原因:通常是PL/SQL编译错误。*操作:
@eMI-该错误表示您的过程中有CREATE语句:我们无法在PL/SQL中执行DDL(通过动态SQL除外).bpgergo的解决方案确实是正确的。如果它对您不起作用,那是因为您误译了它。如果您想让我们发现错误,您必须发布您正在运行的确切代码。Teamviewer?我尝试了bpgergos代码,但它不起作用。在我看来,它也应该起作用-\您的业务逻辑是什么?您为什么在这里吃一个过程。为什么不创建一个静态过程并调整变量的值呢?
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;