问题陈述:用户希望调用一个过程来填充一个表,其中列出列名和找到的唯一值的计数。
我对 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;
现在,是否最好将其写入表中不是主要问题,我的问题是我无法找出为什么它会执行我想要的操作,没有日志,例如没有错误。
任何帮助都会很棒
谢谢你
不要传递
'mychema.mytable'
,也不要传递 'mytable'
(如果您从同一模式运行该过程)或修改您的过程以采用两个参数 owner
和 table_name
并分别传递它们。
您的询问
WHERE table_name = upper(p_table_name)
将评估为
WHERE table_name = 'MYCHEMA.MYTABLE'
但是,表名称将是
MYTABLE
,而不是 MYCHEMA.MYTABLE