sql >> データベース >  >> RDS >> Oracle

テーブル内の2つの行の違いを見つける。オラクル

    PL/SQLブロックと動的CURSORを使用して、このようなものを試すことができます。 。ここでは、ID =1と2を変数として使用していることに注意してください。この変数は、知っておく必要があり、どこかから渡す必要があります。

    DBMS_SQL.RETURN_RESULT (12c以上)は、動的に作成されたカーソルからの出力を表示するために使用されます。または、PRINTを使用することもできます REFCURSORからo/pをフェッチして表示するコマンド 。

    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. PostgreSQLは最も古いレコードを除くすべてを削除します

    2. タイプ'System.DBNull'のオブジェクトをタイプ'System.Byte[]'にキャストできません。

    3. oracle dynamicsqlwhere句の式を評価します

    4. MySQLではMEDIUMINTを避ける必要がありますか?