【问题标题】:PL/SQL - Access the Cursor Data DynamicallyPL/SQL - 动态访问光标数据
【发布时间】:2018-01-16 15:12:54
【问题描述】:

我使用了两个游标 1) c_emp 游标有表数据。 2) c_column_names 游标具有表中的列。 我想动态地使用 c_column_names 游标从 c_emp 游标中获取所有列的数据。

我尝试使用以下代码,但它不起作用:

create or replace procedure sp_read_data(in_tb_nm varchar2) as
cursor c_emp is select * from test_table;
begin    
    open c_column_names for select column_name from all_tab_columns where table_name = 'TEST_TABLE';      
    for emp_row in c_emp
    loop    
      loop
          fetch c_column_names into lc_record;
          exit when c_column_names %notfound;                
          lc_col_nm := 'emp_row.'||lc_record;
          v_dtl := v_dtl || rpad (lc_col_nm, 20, ' ');
      end loop;     
    end loop;      
end sp_read_data;

有没有办法动态访问游标数据?

【问题讨论】:

  • 不清楚您要达到的目标。参数in_tb_nm的用途是什么?你在哪里声明lc_record?也许向我们展示静态 SQL 的样子。
  • 这里需要 2 个循环吗?另外,让我们知道您的最终预期结果是什么。可能有更简单的方法来实现它

标签: oracle plsql


【解决方案1】:

认为你有点在重新发明轮子。为什么不使用 REF CURSOR?

SQL> create or replace function sp_read_data (in_tb_nm in varchar2)
  2    return sys_refcursor
  3  is
  4    cur_r sys_refcursor;
  5  begin
  6    open cur_r for 'select * from ' || in_tb_nm;
  7    return cur_r;
  8  end;
  9  /

Function created.

SQL> select sp_read_data('departments') from dual;
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1
           10 Administration                        200        1700
           20 Marketing                             201        1800
           30 Purchasing                            114        1700
           40 Human Resources                       203        2400
           50 Shipping                              121        1500
           60 IT                                    103        1400
           <snip>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多