【问题标题】:Put Column Name in Variable and use it in output statement将列名放入变量中并在输出语句中使用
【发布时间】:2019-01-29 15:33:09
【问题描述】:

这就是我真正想要做的,在不知道任何列的情况下从表中获取数据,但 i.j.Column_Name 给出了错误,所以我想把它放在一个变量中。读完cmets后,我认为这是不可能的

  DECLARE
     CURSOR C1 IS SELECT * FROM Table_Name;
     CURSOR C2 IS SELECT Table_Name,Column_Name FROM  user_tab_columns 
                   WHERE data_type='VARCHAR2';
     v_table Varchar2(256);
     v_Col varchar2(200);
  BEGIN
      FOR i in C1 LOOP
        FOR j in (SELECT Column_Name FROM user_tab_columns WHERE 
                  Table_Name='Table_Name') LOOP
             dbms_output.put_line(i.j.Column_Name);
    END LOOP;
  END LOOP;
 END;
/

不,没有名为 v_Col 的列

【问题讨论】:

  • 如果您解释了要求,将会有所帮助。 v_Col 到底是什么?列名?你需要它做什么; Table_Name 中的所有列都在“i”游标变量中?很快,我不明白你要做什么。
  • 您的表格中是否有一列名称为v_Col
  • 为什么不直接查询all_tab_columns

标签: oracle plsql dbms-output


【解决方案1】:

您不能动态地引用记录中的字段(这是游标循环提供给您的)。如果你需要灵活地做,那么你可以使用dbms_sql(可能适应this approach),但在你展示的场景中,你可以使用动态SQl来只在光标中获取你想要的列:

-- dummy data
create table table_name (id number, column_name varchar2(10), other_col date);
insert into table_name values (1, 'Test 1', sysdate);
insert into table_name values (2, 'Test 2', sysdate);

DECLARE
    CURSOR C1 IS SELECT * FROM Table_Name;
    v_Cur sys_refcursor;
    v_Col varchar2(200);
    v_Val varchar2(4000);
BEGIN
    v_Col:= 'Column_Name';
    OPEN v_Cur for 'SELECT ' || v_Col || ' FROM Table_Name';
    LOOP
        FETCH v_Cur INTO v_Val;
        EXIT WHEN v_Cur%notfound;
        dbms_output.put_line(v_val);
    END LOOP;
END;
/

Test 1
Test 2

PL/SQL procedure successfully completed.

这样做的缺点是,无论目标列的数据类型是什么,您都必须将其隐式转换为字符串;但无论如何你都会在dbms_output 电话中这样做。因此,如果您更改要打印的列:

    v_Col:= 'Other_Col';

那么我的虚拟数据的输出将是:

2018-08-23
2018-08-23

PL/SQL procedure successfully completed.

使用我当前的 NLS 会话设置将日期值隐式格式化为字符串。

您可以通过检查 user_tab_columns 中的数据类型并更改动态查询和/或获取和处理来获得更高级的信息,但不清楚您真正需要做什么。

【讨论】:

    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2019-04-17
    • 2011-05-25
    • 2017-06-13
    相关资源
    最近更新 更多