Helpex - Trao đổi & giúp đỡ Đăng nhập
12

Tôi đã khai báo các kiểu sau trong gói PL / SQL của mình:

TYPE t_simple_object IS RECORD (
   wert   NUMBER,
   gs     NUMBER,
   vl     NUMBER);

TYPE t_obj_table IS TABLE OF t_simple_object
  INDEX BY BINARY_INTEGER;

Sau đó, tôi khai báo một biến:

obj t_obj_table;

Tuy nhiên, khi tôi muốn sử dụng biến, tôi không thể khởi tạo hoặc mở rộng nó:

obj := t_obj_table ();

đưa ra lỗi sau:

PLS-00222: no function with name 'T_OBJ_TABLE' exists in this scope

Nếu tôi không khởi tạo nó, tôi không thể mở rộng nó để thêm một số ngày như

obj.EXTEND();

đưa ra một lỗi khác:

PLS-00306: wrong number or types of arguments in call to 'EXTEND'

Làm thế nào tôi có thể làm cho nó hoạt động?

12 hữu ích 0 bình luận 56k xem chia sẻ
24

Bạn không mở rộng bảng được lập chỉ mục bởi "cái gì đó", bạn chỉ có thể sử dụng nó ...

DECLARE
   TYPE t_simple_object IS RECORD 
      ( wert   NUMBER
      , gs     NUMBER
      , vl     NUMBER
      ); 

   TYPE t_obj_table IS TABLE OF t_simple_object
   INDEX BY BINARY_INTEGER; 

   my_rec t_simple_object;
   obj t_obj_table; 
BEGIN
   my_rec.wert := 1;
   my_rec.gs := 1;
   my_rec.vl := 1;
   obj(1) := my_rec;
END;
/

Để sử dụng cú pháp EXTEND, ví dụ này sẽ làm điều đó ...

DECLARE
   TYPE t_simple_object IS RECORD 
      ( wert   NUMBER
      , gs     NUMBER
      , vl     NUMBER
      ); 

   TYPE t_obj_table IS TABLE OF t_simple_object; 

   my_rec t_simple_object;
   obj t_obj_table := t_obj_table(); 
BEGIN
   obj.EXTEND;
   my_rec.wert := 1;
   my_rec.gs := 1;
   my_rec.vl := 1;
   obj(1) := my_rec;
END;
/

Cũng xem liên kết này (Hỏi Tom)

24 hữu ích 0 bình luận chia sẻ
8

Nếu bạn không muốn sử dụng một mảng kết hợp (hay còn gọi là bảng chỉ mục) thì hãy loại bỏ mệnh đề "INDEX BY BINARY_INTEGER". Mã của bạn sau đó hoạt động OK:

declare 
    TYPE t_simple_object IS RECORD (
       wert   NUMBER,
       gs     NUMBER,
       vl     NUMBER);
    TYPE t_obj_table IS TABLE OF t_simple_object;
    obj t_obj_table;
begin  
    obj := t_obj_table ();
    obj.EXTEND();
end;
8 hữu ích 0 bình luận chia sẻ
8

Bạn không thể mở rộng một mảng giả định. Chỉ cần gán giá trị cho nó

declare
  TYPE t_simple_object IS RECORD (
    wert   NUMBER,
    gs     NUMBER,
    vl     NUMBER);

  TYPE t_obj_table IS TABLE OF t_simple_object INDEX BY BINARY_INTEGER;

  simple_object t_simple_object;
begin
  simple_object.wert := 1;
  simple_object.gs := 2;
  simple_object.vl := 3;
  obj(1) := simple_object;
end;
/
8 hữu ích 0 bình luận chia sẻ
-1

Hoặc chỉ sử dụng một bản ghi (hoặc liên kết mảng bản ghi)

create or replace package p_test is

  type t_rec is record (
    empname varchar2(50),
    empaddr varchar2(50));

  function p_test_ret_record return t_rec;

end p_test;


create or replace package body p_test is

  function p_test_ret_record return t_rec is
     l_rec t_rec;
  begin
     l_rec.empname := 'P1';
     l_rec.empaddr := 'P2';     
     return l_rec;
  end;

end p_test;

declare
  -- Non-scalar parameters require additional processing 
  result p_test.t_rec;
begin
  -- Call the function
  result := p_test.p_test_ret_record;
  dbms_output.put_line('Name: ' || result.empname || ' Addr: ' || result.empaddr);
end;
-1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ oracle plsql , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading