动态查询的EXCECUTE IMMEDIATE未在DBeaver中生成结果

问题描述 投票:0回答:1
我是 SQL 初学者。 我在 Mac 上使用 DBeaver v 24.1.3 来访问 Oracle 数据库。

我正在使用代码生成一个动态查询,该查询计算表中所有列的非空行的百分比。该查询创建一个包含列名和非空值百分比的表。我想生成查询结果并保存到文件。我将为多个表执行此操作。

我可以使用

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;
    
sql oracle dynamic dbeaver execute-immediate
1个回答
0
投票
尝试将动态生成的查询导出到文件,然后可以在DBeaver中单独执行脚本。修改 PL/SQL 块以将生成的查询写入文件(使用 UTL_FILE)或打印它以供您复制

BEGIN -- Your PL/SQL block DBMS_OUTPUT.PUT_LINE(sql_query); END;
在 DBeaver 中运行打印的查询以导出结果。此方法不会完全自动化所有操作,但它确保您可以通过在 DBeaver 可以生成结果的标准 SQL 上下文中执行 SQL 查询来正确处理输出。

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