Вывод дубликатов с помощью процедуры - PullRequest
1 голос
/ 05 мая 2020

Я занимаюсь изучением и сейчас делаю несколько упражнений.

Я пытаюсь создать процедуру, которая показывает, сколько дубликатов подряд. вещи, но ничего не работает ...

даже результат, который мне дал учитель моей старой школы, не сработал:

CREATE OR REPLACE PROCEDURE check_doppelte_Werte_p ( 
   p_tabellenname   IN     USER_TAB_COLUMNS.TABLE_NAME%TYPE, 
   p_spaltenname    IN     USER_TAB_COLUMNS.COLUMN_NAME%TYPE, 
   p_ergebnis       BOOLEAN 
) OUT     
IS 
   v_dummy           NUMBER := 1; 
   v_sql_anweisung   varchar2 (4000); 
BEGIN 
   v_sql_anweisung := 
         'SELECT   MAX(COUNT (' 
      || p_spaltenname 
      || ')) ' 
      || '  FROM   ' 
      || p_tabellenname 
      || '  GROUP BY ' 
      || p_spaltenname; 

   DBMS_OUTPUT.PUT_LINE (v_sql_anweisung); 

   EXECUTE IMMEDIATE v_sql_anweisung INTO   v_dummy; 

   IF v_dummy > 1 THEN  
     DBMS_OUTPUT.PUT_LINE(   'Die Tabelle ' 
                          || 'hat mindestens  ' 
                          || TO_CHAR (V_DUMMY) 
                          || ' doppelte Werte in der Spalte ' 
                          || p_spaltenname); 
     p_ergebnis := TRUE; 
  ELSE  
     p_ergebnis := FALSE; 
  END IF; 
EXCEPTION 
   -- Keine Werte gefunden, da  
   WHEN NO_DATA_FOUND 
   THEN 
      p_ergebnis := FALSE; 
 DBMS_OUTPUT.PUT_LINE ('Tabellenname oder Spaltenname sind nicht vorhan-
den!!!'); 
END;

Что бы вы сделали / изменили?

1 Ответ

0 голосов
/ 05 мая 2020

Ваш код не заменяет переменные в динамике c sql. Строка запроса должна быть добавлена ​​с входными переменными.

Пожалуйста, попробуйте следующий код,

 CREATE OR REPLACE PROCEDURE anzahl1(
tabelle VARCHAR2,
reihe VARCHAR2,
wieviel OUT NUMBER
)AS
test VARCHAR2(4000);
lv_query VARCHAR2(4000);

BEGIN

lv_query := 'SELECT (COUNT(*)-1) cnt FROM '||tabelle ||' GROUP BY '||reihe||' HAVING COUNT(*) > 1';

EXECUTE IMMEDIATE lv_query into wieviel;

DBMS_OUTPUT.PUT_LINE(wieviel);

EXCEPTION 
     WHEN OTHERS THEN 
       DBMS_OUTPUT.PUT_LINE('ERROR '||SQLCODE||' '||SUBSTR(SQLERRM,1,200));

    END;
/

Я создаю таблицу и заполняю записи, как показано ниже,

   CREATE TABLE EMP(ID NUMBER(10),NAME VARCHAR2(40));

    INSERT INTO EMP VALUES (1, 'TEST');
    INSERT INTO EMP VALUES (1, 'TEST');
    INSERT INTO EMP VALUES (2, 'TEST2');

Теперь я вызываю хранимую процедуру для проверки таблицы EMP для столбца ID,

declare 
lv_cnt number(10);
begin
anzahl1('EMP','ID',lv_cnt);
dbms_output.put_line(lv_cnt);

end;

Это дает результат как,

1
...