我正在使用代码生成一个动态查询,该查询计算表中所有列的非空行的百分比。该查询创建一个包含列名和非空值百分比的表。我想生成查询结果并保存到文件。我将为多个表执行此操作。
我可以使用
DBMS_OUTPUT.PUT_LINE(sql_query);
打印查询。 然后我就用
EXECUTE IMMEDIATE sql_query;
运行查询。我正在
BEGIN / END;
结构中执行此操作。代码运行但没有生成输出表。 如果我在 SQL 编辑器中复制并粘贴打印的查询并运行,我确实会得到输出表。
如何使用动态查询生成输出表? 提前非常感谢。
完整代码如下。
DECLARE
column_name VARCHAR2(255);
sql_query VARCHAR2(32767) := 'WITH column_non_nulls AS (';
dynamic_select VARCHAR2(1000);
total_count NUMBER;
first_column BOOLEAN := TRUE;
BEGIN
-- Get the total number of rows in the table
SELECT COUNT(*) INTO total_count FROM GENERIC.TABLENAME;
-- Loop through each column in the table and dynamically construct the query
FOR col IN (
SELECT column_name
FROM all_tab_columns
WHERE table_name = 'TABLENAME'
AND owner = 'GENERIC'
)
LOOP
column_name := col.column_name;
-- Construct the dynamic SELECT part for each column
dynamic_select := 'SELECT ''' || column_name || ''' AS column_name, ' ||
'ROUND(100 * COUNT(' || column_name || ') / ' || total_count || ', 2) AS percent_non_null ' ||
'FROM GMD.STUDIES WHERE ' || column_name || ' IS NOT NULL';
-- Append the dynamic SELECT part to the SQL query
IF first_column THEN
sql_query := sql_query || dynamic_select;
first_column := FALSE;
ELSE
sql_query := sql_query || ' UNION ALL ' || dynamic_select;
END IF;
END LOOP;
-- Close the CTE and the main SELECT query
sql_query := sql_query || ') SELECT * FROM column_non_nulls ORDER BY percent_non_null DESC';
-- Print the dynamically constructed SQL query for debugging purposes
DBMS_OUTPUT.PUT_LINE(sql_query);
-- Execute the dynamically generated SQL query
EXECUTE IMMEDIATE sql_query;
END;
BEGIN
-- Your PL/SQL block
DBMS_OUTPUT.PUT_LINE(sql_query);
END;
在 DBeaver 中运行打印的查询以导出结果。此方法不会完全自动化所有操作,但它确保您可以通过在 DBeaver 可以生成结果的标准 SQL 上下文中执行 SQL 查询来正确处理输出。