【发布时间】:2022-01-11 17:24:44
【问题描述】:
我想显示基于另一个 sql 的动态 sql 的结果,但得到错误消息。我的代码:
DECLARE
sql_qry VARCHAR2(1000) := NULL;
TYPE results IS
TABLE OF all_tab_columns%rowtype;
results_tbl results;
BEGIN
FOR i IN (
SELECT
*
FROM
all_tab_columns
WHERE
owner = 'OWNER_XYZ'
AND upper(column_name) LIKE '%COLUMN_XYZ%'
ORDER BY
table_name,
column_name
) LOOP
sql_qry := ' SELECT DISTINCT '
|| i.column_name
|| ' as column_name '
|| ' FROM '
|| i.owner
|| '.'
|| i.table_name
|| ' WHERE SUBSTR('
|| i.column_name
|| ',1,1) = ''Y''';
EXECUTE IMMEDIATE sql_qry BULK COLLECT
INTO results_tbl;
dbms_output.put_line(results_tbl);
END LOOP;
END;
我收到错误消息:
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
事实上,我需要所有查询的结果,它们之间有一个这样的联合 [1] [1]:https://i.stack.imgur.com/llxzr.png
【问题讨论】:
-
尝试运行 -
dbms_output.put_line(results_tbl.column_name); -
谢谢,但我收到 PLS-00302:必须声明组件“COLUMN_NAME”
-
results是使用all_tab_columns定义的,因此批量收集无论如何都不起作用(目前还没有那么远);您只从目标表中选择一个列,因此集合需要反映该列及其数据类型。您的put_line也指整个收藏,而不是其中的一条记录;所以results_tbl(1).column_name是有效的,尽管您实际上需要循环并使用索引变量以便查看所有值。