복붙노트

[SQL] 동적 SQL LOOP

SQL

동적 SQL LOOP

동적 SQL은 기본적으로 생각이 나는 테이블에 포함 된 행 수를 얻기 위해 "p_in_table"있었던 파라미터와 절차를 사용할 수 있다는 것입니다, 내 친구가 아닙니다.

CREATE OR REPLACE PROCEDURE how_many_rows(p_in_table VARCHAR2)
IS
  TYPE cur_cur IS REF CURSOR;
  v_cur_cur  cur_cur;
  v_rowcount NUMBER(28);
  v_cur_txt  VARCHAR2(299);    
  BEGIN
    v_cur_txt := 'SELECT * FROM ' || p_in_table;

    OPEN v_cur_cur FOR v_cur_txt;

    LOOP
      v_rowcount := v_cur_cur%ROWCOUNT;
      EXIT WHEN v_cur_cur%NOTFOUND;
    END LOOP;

    CLOSE v_cur_cur;

    dbms_output.put_line(v_rowcount);
  END;

누군가가 내가 잘못을하고있는 중이 야 무엇을 말해한다면 그것을 preciate시겠습니까?

해결법

  1. ==============================

    1.더 그래서, 기본적으로, 당신은 무한 루프를 가지고, 그런 문 또는 무언가를 가져 - 문제는 당신이 커서를 반복하지 것입니다. 이 같은 것을 할 필요가이 문제를 방지하려면 :

    더 그래서, 기본적으로, 당신은 무한 루프를 가지고, 그런 문 또는 무언가를 가져 - 문제는 당신이 커서를 반복하지 것입니다. 이 같은 것을 할 필요가이 문제를 방지하려면 :

    CREATE OR REPLACE PROCEDURE how_many_rows
       (p_in_table VARCHAR2) IS
       TYPE cur_cur IS REF CURSOR;
       v_cur_cur cur_cur;
       v_rowcount NUMBER(28);
       v_cur_txt VARCHAR2(299);
       v_row SOME_TABLE%ROWTYPE; --add row variable
    BEGIN
       v_cur_txt := 'SELECT * FROM '|| p_in_table;
    
    OPEN v_cur_cur FOR v_cur_txt;
       LOOP
          v_rowcount := v_cur_cur%ROWCOUNT;
          FETCH v_cur_cur INTO v_row; --fetch a row in it
             EXIT WHEN v_cur_cur%NOTFOUND;
       END LOOP;
    CLOSE v_cur_cur;
    
    DBMS_OUTPUT.PUT_LINE(v_rowcount);
    END;
    

    그러나, 당신이 볼 수 있듯이, 당신이 알아야 할이 작업을 수행하는, 그래서 이것은 일반적인 솔루션 어떤 테이블 당신에게있는 거 quering을하지 않습니다. 어쩌면 거기에 이것에 대한 해결 방법은,하지만 난 당신이 EXECUTE IMMEDIATE를 가진 예를 들어, 더 간단하고 효율적인 방법을 사용, 제안 :

    CREATE OR REPLACE PROCEDURE HOW_MANY_ROWS(p_in_table VARCHAR2)
           IS
    v_tmp NUMBER;
    BEGIN
    
    EXECUTE IMMEDIATE 'SELECT COUNT(1) FROM ' || p_in_table INTO v_tmp;
    DBMS_OUTPUT.PUT_LINE(v_tmp);
    
    END;
    

    당신의 테이블에서 ROWNUM을 가져, 모든 테이블이가 있고 그것의 유형을 알고 - - 번호를 확인, 나는이 여기에 당신의 방법을 사용하고 달성하는 방법에 대한 생각을 준 것은 내가 함께 결국 한 것입니다. 따라서이 절차는 일반적인 경우에 작동합니다 :

    CREATE OR REPLACE PROCEDURE how_many_rows
       (p_in_table VARCHAR2) IS
       TYPE cur_cur IS REF CURSOR;
       v_cur_cur cur_cur;
       v_rowcount NUMBER(28);
       v_cur_txt VARCHAR2(299);
       v_row NUMBER; --add rownum variable
    BEGIN
       v_cur_txt := 'SELECT ROWNUM FROM '|| p_in_table; --select only rownum from target table
    
    OPEN v_cur_cur FOR v_cur_txt;
       LOOP
          v_rowcount := v_cur_cur%ROWCOUNT;
          FETCH v_cur_cur INTO v_row; --fetch rownum in it
             EXIT WHEN v_cur_cur%NOTFOUND;
       END LOOP;
    CLOSE v_cur_cur;
    
    DBMS_OUTPUT.PUT_LINE(v_rowcount);
    END;
    
  2. from https://stackoverflow.com/questions/21090673/dynamic-sql-loop by cc-by-sa and MIT license