将列名放在变量中并在输出语句中使用它
Put Column Name in Variable and use it in output statement
这是我真正想做的,在不知道任何列的情况下从 Table 获取数据,但是 i.j.Column_Name 给出了一个错误,所以我想把它放在一个变量中。看了评论我觉得不可能
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
的列
您不能动态引用记录中的字段(这是游标循环为您提供的内容)。如果你需要灵活地做,那么你可以使用 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
中的数据类型并更改动态查询 and/or 获取和处理来获得更多高级信息,但不清楚您真正需要做什么。
这是我真正想做的,在不知道任何列的情况下从 Table 获取数据,但是 i.j.Column_Name 给出了一个错误,所以我想把它放在一个变量中。看了评论我觉得不可能
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
的列您不能动态引用记录中的字段(这是游标循环为您提供的内容)。如果你需要灵活地做,那么你可以使用 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
中的数据类型并更改动态查询 and/or 获取和处理来获得更多高级信息,但不清楚您真正需要做什么。