计算oracle中PL/SQL所有列中找到的唯一值

问题描述 投票:0回答:2

问题陈述:用户希望调用一个过程来填充一个表,其中列出列名和找到的唯一值的计数。

我对 SQL 并不陌生,但对 Oracle 很陌生,我一直在尝试为上述问题编写一个过程,了解到在 Oracle 中可以执行循环。下面的代码运行没有错误,但实际上什么也没做,甚至没有填充表。

该过程是通过使用运行的

EXEC PRC_UNIQUE_COUNTS('mychema.mytable');

允许用户在他们选择的表上运行此操作,它应该在再次插入数据之前截断该表。

可以用一些指针来查看我何时出错,因为日志给了我

PL/SQL 过程成功完成。

代码如下

CREATE OR REPLACE PROCEDURE PRC_UNIQUE_COUNTS (
    p_table_name IN VARCHAR2
) IS
    v_column_name  VARCHAR2(128);
    v_unique_count NUMBER;
    v_sql          VARCHAR2(4000);
BEGIN
   -- Truncate the output table
    EXECUTE IMMEDIATE 'TRUNCATE TABLE myschema.TBL_UNIQUE_COUNTS';
    FOR t IN (
        SELECT
            column_name
        FROM
            all_tab_columns
        WHERE
            table_name = upper(p_table_name)
        ORDER BY
            column_id
    ) LOOP
        v_column_name := t.column_name;
      
      -- Dynamic SQL to get the count of unique values in the column
        v_sql := 'SELECT COUNT(DISTINCT '
                 || v_column_name
                 || ') FROM '
                 || p_table_name;
        EXECUTE IMMEDIATE v_sql
        INTO v_unique_count;
      
      -- Insert the result into the output table
        INSERT INTO myschema.tbl_unique_counts (
            col_name,
            unique_count
        ) VALUES (
            v_column_name,
            v_unique_count
        );

    END LOOP;

    COMMIT;  -- Commit the transaction
EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line('An error occurred: ' || sqlerrm);
END;

现在,是否最好将其写入表中不是主要问题,我的问题是我无法找出为什么它会执行我想要的操作,没有日志,例如没有错误。

任何帮助都会很棒

谢谢你

oracle loops plsql profiling
2个回答
0
投票

不要传递

'mychema.mytable'
,也不要传递
'mytable'
(如果您从同一模式运行该过程)或修改您的过程以采用两个参数
owner
table_name
并分别传递它们。


0
投票

您的询问

WHERE table_name = upper(p_table_name)

将评估为

WHERE table_name = 'MYCHEMA.MYTABLE'

但是,表名称将是

MYTABLE
,而不是
MYCHEMA.MYTABLE

© www.soinside.com 2019 - 2024. All rights reserved.