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

我有一个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;
所以,你可以看到,我正在创建一个表,然后是一个过程,它填充了表。 现在我想为这些参数设置两个变量:
'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;