【问题标题】:How to iterate through column names in Oracle PL/SQL?如何遍历 Oracle PL/SQL 中的列名?
【发布时间】:2020-09-29 23:40:51
【问题描述】:

我正在尝试遍历 SQL 的列名以应用一些动态查询。但是,我在迭代这些列名时遇到了问题。

我总是有一个错误提示 通常是 PL/SQL 编译错误

代码如下:

SQL 代码:

DECLARE
 CURSOR c IS
  SELECT COLUMN_NAME FROM ALL_COL_COMMENTS WHERE table_name='my_table_name';
 BEGIN
     FOR current_field IN c LOOP
         dbms_output.put_line(current_field);
         ...Dynamic SELECT QUERY
         new_string = new_string || ',' || current_field;
         dbms_output.put_line(new_string);
     END LOOP;
 END;

最终目标是每次在sql查询中添加新字段并保存其结果时,计算我的观察次数。

伪代码:

current string = ''
result = array(len(all_field))
for current_field in all_field:
   result[idx] = SQL_QUERY(current_string)
   current_string = current_string + ',' + current_field         

【问题讨论】:

  • 你还没有定义new_string;但是...Dynamic SELECT QUERY 实际上在做什么?除了 ORA-06550“通常是 PL/SQL 编译错误”,您还看到了哪些其他错误。留言?
  • 两件事。您的意思是使用 ALL_TAB_COMMENTS 吗?它有效,但我相信更好的选择是使用 ALL_TAB_COLUMNS 或 USER_TAB_COLUMNS。每当使用以“ALL”开头的字典视图时,请始终指定所有者。如果另一个模式有同名的表,您将遇到麻烦。更好的是,如果您严格使用自己的模式,请指定 USER 而不是 ALL。用户视图没有所有者字段,因为它们只返回当前用户的记录。
  • ... 动态 SELECT 查询本质上是按 new_string 对列进行分组并计算行数。我正在遍历列,通过这样做我可以测量一些列的潜在值偏差,因为行数会增加。通常对于具有相同 ID 的所有行,所有值都应该相同,但事实并非如此,我需要发现未正确复制的变量。查询具有以下形式SELECT COUNT(*) As "AGG_" FROM (SELECT new_string FROM my_table GROUP BY new_string)

标签: sql oracle plsql dynamic-sql


【解决方案1】:

试试:

set echo on
set serveroutput on
DECLARE
 new_string varchar2(250);
 CURSOR c IS
  SELECT COLUMN_NAME FROM ALL_COL_COMMENTS WHERE table_name='mytablename';
BEGIN
  FOR current_field IN c LOOP
      dbms_output.put_line(current_field.column_name);
      new_string := new_string || ',' || current_field.column_name;
      dbms_output.put_line(new_string);
 END LOOP;
END;
/

【讨论】:

    【解决方案2】:

    这不是您问题的答案,但我通常使用LISTAGG 制作列名的动态列表:

    CREATE TABLE t (a NUMBER, b NUMBER, c NUMBER);
    
    SELECT LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_id) AS cols
      FROM user_tab_columns
     WHERE table_name = 'T';
    
    COLS
    A,B,C
    

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 2021-11-25
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多