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

カーソル付きのPL/SQLネストループ

    REF CURSORからフェッチする必要があります カーソルを開いているときに、column_nameをselectステートメントに動的に追加します。ここでは、USER_TAB_COLUMNSからすべての列名を取得しています。 テーブルEMPLOYEESの場合 対応する値をv_tempに割り当てます。

    SET SERVEROUTPUT ON;
    DECLARE
      v_temp VARCHAR(50);
      query1 VARCHAR2(1000);
      c1 SYS_REFCURSOR;
      CURSOR c2
      IS
        SELECT COLUMN_NAME xxx FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EMPLOYEES';
    BEGIN
      FOR s2 IN c2
      LOOP
        --do something
        query1 := 'SELECT ' ||s2.xxx||' FROM EMPLOYEES';
        OPEN c1 FOR query1 ;
        LOOP
          FETCH c1 INTO v_temp;
          DBMS_OUTPUT.PUT_LINE('COLUMN:'||s2.xxx||', VALUE:'|| v_temp);
          EXIT
        WHEN c1%NOTFOUND;
        END LOOP;
        CLOSE c1;
      END LOOP;
    END;
    /
    

    Employeesのすべての列の長さから <50、正常に動作しています。変換はNUMBERに対して暗黙的に行われます。 およびDATE データ型。

    これが出力例です。

    COLUMN:EMPLOYEE_ID, VALUE:100
    COLUMN:EMPLOYEE_ID, VALUE:101
    COLUMN:EMPLOYEE_ID, VALUE:102
    COLUMN:FIRST_NAME, VALUE:Eleni
    COLUMN:FIRST_NAME, VALUE:Eleni
    COLUMN:LAST_NAME, VALUE:Whalen
    COLUMN:LAST_NAME, VALUE:Fay
    COLUMN:HIRE_DATE, VALUE:17-06-03
    COLUMN:HIRE_DATE, VALUE:21-09-05
    


    1. ODP.NETマネージド-要求された.NetFrameworkデータプロバイダーが見つかりません

    2. SQL Serverの実行ポートを見つける方法は?

    3. MariaDBでのCONCAT()のしくみ

    4. SQLでは、2つのテーブルが相互に参照しても問題ありませんか?