【问题标题】:ORACLE SQL CURSOR / FOR LOOPORACLE SQL 游标/FOR 循环
【发布时间】:2017-09-26 14:11:56
【问题描述】:

我需要验证转换后的数据、不同的值和记录数。我想编写语句,以便我可以输入表名,然后检索它的列并在查询中使用它们来获取其不同的值(实际值,而不仅仅是有多少不同的计数)及其计数。

我想我需要一个 CURSOR 或 CURSOR FOR LOOP 并创建这样的东西:

declare 
    cursor field_name
is 
  select COLUMN_NAME
     from user_tab_cols
     where table_name='TABLE1'
c_field_name    field_name%ROWTYPE;


BEGIN
    OPEN field_name
    loop 
        fetch field_name INTO c_field_name;
        exit when field_name%NOTFOUND;
    end loop;
    CLOSE field_name;
end;

然后使用上述类似的方式运行查询

select field_name, count(*)
from table1
group by field_name

我需要创建 2 个循环语句吗?到目前为止,我还没有创建一个,也无法完全了解获得结果的上下文。

【问题讨论】:

  • 是否有什么东西阻止您在 2 个查询中获取不同的值和计数,然后将它们连接到一个关键字段上?在进行多个循环之前,我会尝试使用动态 SQL。
  • 如果您可以编辑以显示一些示例输出,您可能期望这些示例输出仅用于一张表,这可能更好地说明您想要实现的目标。

标签: sql oracle for-loop plsql cursor


【解决方案1】:
BEGIN
    FOR myrow in (select field_name, count(*) as "count" from table1 group by field_name)
    loop 
        dbms_output.put_line(myrow.field_name);
        dbms_output.put_line(myrow.count);
    end loop;
end;

【讨论】:

    【解决方案2】:

    考虑到您将在下面的代码中将表名作为参数提供,将一一打印所有列的所有值以及值的计数

    create or replace PROCEDURE PR_PREP(
    P_TABLE_NAME IN VARCHAR2)
    IS
      CURSOR CUR_COLUMNS (PA_TABLE_NAME VARCHAR2)
      IS
        SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = PA_TABLE_NAME;
      COL_NAMES CUR_COLUMNS%ROWTYPE;
    TYPE TYP_RECORD
     IS
     RECORD
     (
       FIELD_NAME VARCHAR2(255),
      CNT        INT);
    TYPE TYP_OP_TABLE
    IS
     TABLE OF TYP_RECORD;
      OP_TABLE TYP_OP_TABLE;
     I     INT;
     V_SQL VARCHAR2(2000);
    BEGIN
      FOR COL_NAMES IN CUR_COLUMNS(P_TABLE_NAME)
       LOOP
         V_SQL := 'SELECT ' || COL_NAMES.COLUMN_NAME || ' AS FIELD_NAME , 
     COUNT(*) AS CNT FROM ' || 
             P_TABLE_NAME || ' GROUP BY ' || COL_NAMES.COLUMN_NAME ;
      --    DBMS_OUTPUT.PUT_LINE (V_SQL);
         EXECUTE IMMEDIATE V_SQL BULK COLLECT INTO OP_TABLE;
      dbms_output.put_line('columna name = ' ||COL_NAMES.COLUMN_NAME);
         FOR I IN OP_TABLE.FIRST .. OP_TABLE.LAST
         LOOP
           DBMS_OUTPUT.PUT_LINE('FIELD VALUE '||OP_TABLE(I).FIELD_NAME || ' COUNT = ' || OP_TABLE(I).CNT);
         END LOOP;
          DBMS_OUTPUT.PUT_LINE('ONE FILED ENDED , NEXT STARTED');
        END LOOP;
     END;
    

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2017-06-29
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多