Переменная SQL, как это сделать? - PullRequest
2 голосов
/ 09 января 2012

У меня есть этот 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' (поэтому мне не всегда нужно писать это вручную, потому что это значение сильно меняется)

Я пыталсяthis ( включает только первую часть вышеприведенного оператора ):

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-выражение в Head, которое работает, только с 2 переменными больше , 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;

Но оно не должно содержать «MISSINGTABLES процедуры создания или замены» и т. Д., Только утверждение INSERTЯ не могу выполнить процедуру в любом случае ..

еще лучше было бы использовать скрипт от bpgergo, если бы он пошел.

Ответы [ 3 ]

4 голосов
/ 09 января 2012

Надеюсь, я не перепутал аргументы, вы должны проверить их снова

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;

EDIT

Вы бы назвали это как:

begin
    MISSINGTABLES ('PEKA_ERP_001', 'ASE_ERP_001');
end;
1 голос
/ 09 января 2012

Могу ли я предложить улучшение вашего 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;
1 голос
/ 09 января 2012

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...