2015-01-01 4 views
0

Ниже приведено требование для скрипта oracle. , если С1, С2, С3 ... столбцы в таблице ТСценарий Oracle для выполнения арифметической операции по столбцу по столбцу

Когда я ввести имя таблицы T к сценарию, он должен дать выход в

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.

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; 

См. Example 8 в документации Oracle для получения более подробной информации.

Смежные вопросы