PL/SQL

2009-10-22 7 views
10

मैं अपने PL/SQL पैकेज में निम्नलिखित प्रकार घोषित किया है रिकॉर्ड्स में दर्ज तालिकाओं का उपयोग:PL/SQL

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; 

तो मैं एक चर घोषित:

obj t_obj_table; 

हालांकि, जब मैं चाहता हूँ चर का उपयोग करने के लिए, मैं प्रारंभ नहीं कर सकते हैं या इसे विस्तार:

obj := t_obj_table(); 

निम्नलिखित errror देता है:

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

मैं इसे शुरू नहीं किया जा रहा है, तो मैं के रूप में

obj.EXTEND(); 

कुछ तारीख को जोड़ने के लिए यह विस्तार नहीं कर सकते एक और त्रुटि देता है:

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

मैं कैसे यह काम कर सकते हैं?

उत्तर

19

आप एक मेज "कुछ" द्वारा अनुक्रमित विस्तार नहीं, तुम बस के लिए इसका इस्तेमाल कर सकते हैं ...

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; 
/

वाक्य रचना का विस्तार का उपयोग करने के लिए, इस उदाहरण चाहिए यह ...

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; 
/

भी देख पा रहे हैं this link (Ask Tom)

7

आप एक आक्रामक सरणी नहीं बढ़ा सकते हैं। बस इसे करने के लिए मान निर्दिष्ट

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; 
/
7

यदि आप डॉन एक एसोसिएटिव सरणी (उर्फ इंडेक्स-बाय टेबल) का उपयोग नहीं करना चाहते हैं, फिर "INDEX BY BINARY_INTEGER" खंड छोड़ दें। आपका कोड फिर ठीक काम करता है:

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; 
0

या सिर्फ एक रिकॉर्ड (या रिकॉर्ड की सहयोगी सरणी)

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; 
का उपयोग
संबंधित मुद्दे