2015-01-01 3 views
0

다음은 Oracle 스크립트의 요구 사항입니다. C1, C2, C3은 ... 테이블 T의 열이있는 경우열 단위로 산술 연산을 수행하는 Oracle 스크립트

I 스크립트를 테이블 이름 T를 입력

그것이 I 함께 순서를 기입 시도

C1 = COUNT(DISTINCT(C1))/COUNT(C1) 
C2 = COUNT(DISTINCT(C2))/COUNT(C2) 
C3 = COUNT(DISTINCT(C3))/COUNT(C3) 

로 출력을 제공한다 USER_TAB_COLUMNS에서 열의 이름을 하나씩 가져 오는 커서입니다.

CREATE OR REPLACE PROCEDURE PROC1(TABLE_NAME IN VARCHAR) AS 

DECLARE 
col varchar2(30) 
cursor c1 as select column_name from user_tab_columns where table_name ='TABLE_NAME'; 
open c1; 
BEGIN 
Select c1 into col from USER_TAB_COLUMNS WHERE TABLE_NAME ='TABLE_NAME' 

END 

이 후에 나는 길을 잃었습니다. 나는 이것에 초보적이다. 이 문제에 대한 해결책을 알려주십시오. 계속할 수 없습니다. 모든 접근 방식을 높이 평가합니다.

테이블의 이름을 입력 할 때 출력은 산술 연산에 표시된대로 열과 값의 목록이어야합니다.

+1

동적 테이블 이름을 사용하려면 [동적 SQL] (http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm)이 필요합니다. –

답변

1

실뱅 (Sylvain)에 따르면 동적 SQL, 특히 DBMS_SQL 패키지가 필요합니다. 이 기술을 사용하여 새로운 SQL 문을 생성 한 다음 EXECUTE IMMEDIATE를 사용하기 쉽도록 SQL 문을 실행합니다.

DECLARE 
    c   NUMBER; 
    d   NUMBER; 
    col_cnt  INTEGER; 
    rec_tab  DBMS_SQL.DESC_TAB; 
    col_num NUMBER; 

BEGIN 

c := DBMS_SQL.OPEN_CURSOR; 

DBMS_SQL.PARSE(c, 'SELECT * FROM scott.bonus', DBMS_SQL.NATIVE); 

d := DBMS_SQL.EXECUTE(c); 

DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab); 

FOR col_num IN 1..col_cnt 
    LOOP 
     DBMS_OUTPUT.PUT_LINE('Column Name:' || rec_tab.col_name); 
     /* Build your new SQL statement here */ 
    END LOOP; 
    END IF; 

    DBMS_SQL.CLOSE_CURSOR(c); 

    END; 

자세한 내용은 Oracle 설명서의 Example 8을 참조하십시오.

관련 문제