以下是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
在此之后我迷路了。我是新来的。请帮我解决这个问题。我无法继续。任何方法都表示赞赏。
输入表的名称时,输出应该是列的列表和算术运算中显示的值。
答案 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。