我是PLSQL的新手并尝试完成以下操作:遍历用户架构中的所有列,并为每列输出唯一值。
我尝试使用嵌套游标,初始游标是每列,嵌套游标是每列的唯一值。我遇到的问题似乎是嵌套游标具有各种类型的值(取决于列),并且无法将INTO置于定义为varchar2的变量中。 This question表明这应该有效,并且日期和数字变量将隐式转换为字符。但是,我似乎无法使用它,我的代码会产生以下错误:
ORA-06502:PL / SQL:数字或值错误。
我尝试过使用to_char()强制光标成为字符变量(不成功):
' FETCH TO_CHAR(row_cursor)INTO ...'
哪个也行不通。
有没有办法存储未知类型的数据以便输出?有没有更好的方法来为模式中的所有列列出唯一值?
编辑:根据@ Kaushik-Nayak的评论,我深入研究了正在处理的一些列/表。一些内部Oracle视图似乎已弃用类型(我开始看到很多ORA-00932: inconsistent datatypes: expected CHAR got LONG
)错误(这导致我this question)。为了解决这个问题,我使用一个公共前缀(在本例中为' MY _')为我想要分析的所有表做了前缀,并添加了一个带有来自SUBSTR()函数的辅助的WHERE子句以仅获取来自具有user_tab_columns
表中公共前缀的表。此更改解决了问题:
DECLARE
row_cursor SYS_REFCURSOR;
var_rowval VARCHAR2(4000);
BEGIN
FOR c IN (SELECT table_name, column_name FROM user_tab_columns WHERE SUBSTR(table_name, 1, 2) = 'MY')
LOOP
这是我的(原始)代码:
DECLARE
row_cursor SYS_REFCURSOR;
var_rowval VARCHAR2(500);
BEGIN
FOR c IN (SELECT table_name, column_name FROM user_tab_columns)
LOOP
OPEN row_cursor
FOR 'SELECT DISTINCT ' || c.column_name || ' FROM ' || c.table_name;
LOOP
FETCH row_cursor INTO var_rowval;
dbms_output.put_line(c.table_name || ', ' || c.column_name || ': ' || var_rowval );
EXIT WHEN row_cursor%NOTFOUND;
END LOOP;
CLOSE row_cursor;
END LOOP;
END;