Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

chọn giá trị cột động từ một biến kiểu hàng trong pl sql

Bạn không thể tham chiếu động đến tên cột / trường thông qua một biến khác.

Bạn sẽ cần xử lý toàn bộ data_table truy vấn động; đây là bản trình diễn với dbms_sql gói :

declare
  l_col_name varchar2(100);
  l_col_val varchar2(100);
  type t_col_tab is table of column_table%rowtype;
  l_col_tab t_col_tab;

  -- for dbms_sql
  l_c pls_integer;
  l_col_cnt pls_integer;
  l_desc_t dbms_sql.desc_tab;
  l_rc pls_integer;
  l_varchar varchar2(4000);
begin
  select * bulk collect into l_col_tab from column_table;

  -- create cursor and prepare from original query
  l_c := dbms_sql.open_cursor;
  dbms_sql.parse(c=>l_c, statement=>'select * from data_table',
    language_flag=>dbms_sql.native);
  dbms_sql.describe_columns(c => l_c, col_cnt => l_col_cnt,
    desc_t => l_desc_t);

  for i in 1..l_col_cnt loop
    dbms_sql.define_column(c=>l_c, position=>i,
      column=>l_varchar, column_size=>4000);
  end loop;

  l_rc := dbms_sql.execute(c=>l_c);

  while dbms_sql.fetch_rows(c=>l_c) > 0 loop
    for i in 1..l_col_cnt loop
      for j in 1..l_col_tab.count loop
        if l_desc_t(i).col_name = l_col_tab(j).column_name then
          -- same column
          dbms_sql.column_value(l_c, i, l_varchar);
          dbms_output.put_line('Row ' || dbms_sql.last_row_count
           || ': ' || l_desc_t(i).col_name
           || ' = ' || l_varchar);
        end if;
      end loop;
    end loop;
  end loop;

  dbms_sql.close_cursor(l_c);
end;
/

Truy vấn con trỏ được phân tích cú pháp và thực thi, và mô tả bảng cho phép so sánh tên cột. Đây chỉ là việc in ra thông tin, nhưng rõ ràng là bạn có thể làm bất cứ điều gì bạn cần với nó.

Với các bảng giả được tạo dưới dạng:

create table data_table(id number, column_1 date, column_2 varchar2(10), column_3 varchar2(10));
insert into data_table (id, column_1, column_2, column_3) values (1, date '2017-01-01', 'dummy', 'first');
insert into data_table (id, column_1, column_2, column_3) values (2, date '2017-02-01', 'dummy', 'second');

create table column_table (column_name varchar2(30));
insert into column_table (column_name) values ('ID');
insert into column_table (column_name) values ('COLUMN_3');

... cái này nhận được kết quả:

Row 1: ID = 1
Row 1: COLUMN_3 = first
Row 2: ID = 2
Row 2: COLUMN_3 = second

PL/SQL procedure successfully completed.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi nên đặt tài nguyên trình cài đặt ở đâu (tệp wxs, dmg-script, biểu tượng) và cách định cấu hình antrun maven khi triển khai ứng dụng độc lập

  2. Tìm kiếm các từ tương tự bằng cách sử dụng một chỉ mục

  3. Lấy trung điểm của đa tuyến SDO.GEOMETRY

  4. Oracle SQL:Truy vấn SQL tạo ra kết quả gấp 4 lần và dữ liệu sẽ không theo thứ tự chính xác

  5. Tắt CAST AS để tối ưu hóa truy vấn trong Entity Framework