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

Cách hiển thị kết quả của một thủ tục bên ngoài nó trong Oracle

Để kiểm tra quy trình bạn đã chỉ ra, bạn sẽ làm như sau:

declare
  l_id hr_position.id%type;
  l_group_name hr_position.group_name%type;
  l_group_level hr_position.group_level%type;
begin
  drill_record_position('D', l_id, l_group_name, l_group_level);
  dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
end;
/

Nhưng điều đó - hoặc cụ thể hơn, thủ tục của bạn - chỉ hoạt động nếu có chính xác một hàng trong tập hợp kết quả của truy vấn cho loại giá trị được truyền vào. Có vẻ như bạn đang mong đợi nhiều hàng trở lại (sẽ có quá nhiều hàng), nhưng cũng có thể có không (sẽ không tìm thấy dữ liệu).

Vì vậy, thực sự có vẻ như câu hỏi của bạn nên là về cách viết thủ tục của bạn để nó hoạt động với một trong các phương pháp truy xuất / kiểm tra mà bạn đã thử.

Nếu thủ tục của bạn cần trả về nhiều hàng thì nó có thể sử dụng con trỏ tham chiếu, ví dụ:

create or replace procedure drill_record_position (
  p_record_type in varchar2,
  p_ref_cursor out sys_refcursor
)
as
begin
  open p_ref_cursor for
    select hr.id, hr.group_name, hr.group_level
    from hr_position hr
    join drill_position dp
    on hr.id = dp.id
    where dp.typevalue = p_record_type;
end drill_record_position;
/

mà bạn có thể kiểm tra sau đó với một cái gì đó như:

declare
  l_ref_cursor sys_refcursor;
  l_id hr_position.id%type;
  l_group_name hr_position.group_name%type;
  l_group_level hr_position.group_level%type;
begin
  drill_record_position('D', l_ref_cursor);
  loop
    fetch l_ref_cursor into l_id, l_group_name, l_group_level;
    exit when l_ref_cursor%notfound;
    dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
  end loop;
  close l_ref_cursor;
end;
/

Bạn cũng có thể làm điều đó dưới dạng một hàm, có thể dễ dàng hơn để làm việc với ứng dụng của bạn:

-- drop procedure drill_record_position;

create or replace function drill_record_position (p_record_type in varchar2)
return sys_refcursor as
  l_ref_cursor sys_refcursor;
begin
  open l_ref_cursor for
    select hr.id, hr.group_name, hr.group_level
    from hr_position hr
    join drill_position dp
    on hr.id = dp.id
    where dp.typevalue = p_record_type;
  return l_ref_cursor;
end drill_record_position;
/

declare
  l_ref_cursor sys_refcursor;
  l_id hr_position.id%type;
  l_group_name hr_position.group_name%type;
  l_group_level hr_position.group_level%type;
begin
  l_ref_cursor := drill_record_position('D');
  loop
    fetch l_ref_cursor into l_id, l_group_name, l_group_level;
    exit when l_ref_cursor%notfound;
    dbms_output.put_line(l_id ||':'|| l_group_name ||':'|| l_group_level);
  end loop;
  close l_ref_cursor;
end;
/

Bạn cũng có thể thực hiện việc này với các bộ sưu tập và một hàm pipelined, còn nhiều công việc hơn để thiết lập:

create type t_drill_obj as object (
   -- use your real data types...
  id number,
  group_name varchar2(10),
  group_level number
)
/

create type t_drill_tab as table of t_drill_obj
/

create or replace function drill_record_position (p_record_type in varchar2)
return t_drill_tab pipelined as
begin
  for l_row in (
    select t_drill_obj(hr.id, hr.group_name, hr.group_level) as obj
    from hr_position hr
    join drill_position dp
    on hr.id = dp.id
    where dp.typevalue = p_record_type
  )
  loop
    pipe row (l_row.obj);
  end loop;
  return;
end drill_record_position;
/

nhưng bạn có thể gọi nó như một phần của một truy vấn khác và thậm chí tham gia vào kết quả của nó nếu bạn cần:

select * from table(drill_record_position('D'));



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP:oci_bind_by_name và trường dấu thời gian cho kết quả ORA-01461:có thể liên kết một giá trị LONG chỉ để chèn vào cột LONG

  2. oracle 12c - chọn chuỗi sau lần xuất hiện cuối cùng của một ký tự

  3. đầu ra có chữ cái đầu tiên và cuối cùng là nguyên âm (a, e, i, o, u)

  4. Đẩy con trỏ đơn

  5. 'KHÔNG THÍCH' trong một truy vấn SQL