Oracle脚本逐列进行算术运算

时间:2015-01-01 10:58:35

标签: sql plsql oracle11g

以下是oracle脚本的要求。 如果C1,C2,C3 ......是表T中的列

当我将表名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 个答案:

答案 0 :(得分: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;

有关详细信息,请参阅Oracle文档中的Example 8