Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Znajdowanie różnicy między dwoma wierszami w tabeli. Wyrocznia

Możesz spróbować czegoś takiego z blokiem PL/SQL i dynamicznym CURSOR .Zauważ, że tutaj bawię się ID =1 i 2 jako zmienną, którą powinieneś znać i skądś przekazywać.

DBMS_SQL.RETURN_RESULT (12c i nowsze) służy do wyświetlania danych wyjściowych dynamicznie skonstruowanego kursora. Alternatywnie możesz użyć PRINT polecenie, aby pobrać i wyświetlić o/p z REFCURSOR .

SET serveroutput ON
DECLARE
  v_ref SYS_REFCURSOR;
  id1 X.ID%TYPE := 1;
  id2 X.ID%TYPE := 2;
  v_col  VARCHAR2(32);
  v_cols VARCHAR2(1000);
BEGIN
  FOR r IN
  ( SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = 'X'
  )
  LOOP
    EXECUTE IMMEDIATE ' 
SELECT 
CASE                 
WHEN a.'||r.column_name|| ' = ' || 'b.'|| r.column_name ||'                               
THEN a.'||r.column_name || ' END                     
FROM                           
X  a                
CROSS JOIN X b WHERE 
a.ID = :Id1 AND b.ID = :Id2' INTO v_col USING id1,id2 ;
    v_cols := v_cols ||
    CASE
    WHEN v_col IS NULL THEN
      ','||r.column_name
    END;
  END LOOP;
  v_cols := TRIM(BOTH ',' FROM v_cols);
  OPEN v_ref FOR 'select ' || v_cols || '  FROM X WHERE ID =  '||id1||'                
UNION ALL   select ' || v_cols || '  FROM X WHERE ID =  '||id2 ;
  DBMS_SQL.RETURN_RESULT(v_ref);
END;
/
ResultSet #1


ID                 CITY      ZIP          SEGMENT_ONE 
------------------ --------- ------------ ----------- 
1                            14228        X71         
2                  JamesTown 14845        X72         


PL/SQL procedure successfully completed.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mogę przechowywać ciąg binarny w kolumnie CLOB?

  2. Oracle 11g:Unpivot wiele kolumn i uwzględnij nazwę kolumny

  3. Jaki jest idealny zestaw narzędzi do programowania w PL/SQL?

  4. dlaczego zapytanie trwa zbyt długo

  5. Funkcja NVL() w Oracle