2013-02-01 4 views
0

오라클 객체에 문제가 있습니다. 나는 기능을 쓰고있다.오라클 객체 내부 테이블의 객체

CURSOR cResultValues (p_vrc_mnemo VARCHAR2, 
         p_pdt_mnemo VARCHAR2, 
         p_table t_crt_list_prdt_conf_tab) IS 
SELECT pdt_grp_mnemo, 
     pdt_mnemo, 
     pdt_variant, 
    FROM TABLE(p_table) 
WHERE pdt_mnemo = p_pdt_mnemo AND 
     pdt_variant = p_vrc_mnemo; 

을 더 명확 글로벌 종류를 만들기 위해 : 등등

CREATE OR REPLACE TYPE t_pdt_config_rec IS OBJECT( 
    pdt_grp_mnemo    VARCHAR2(30), 
    pdt_mnemo     VARCHAR2(30), 
    pdt_variant     VARCHAR2(30), 
/
CREATE OR REPLACE TYPE t_pdt_config_tab IS TABLE OF t_pdt_config_rec 
/
------------------------------------------------------------------------------------- 
CREATE OR REPLACE TYPE t_list_conf_rec IS OBJECT(
    pdt_conf t_pdt_config_rec, -- product info 
    pdt_childs t_pdt_config_tab) -- products compinations 
/
CREATE OR REPLACE TYPE t_list_conf_tab IS TABLE OF t_list_conf_rec 
/

을 선택하고이있다. 변경 이전에는 t_pdt_config_tab 만 있었고 아무런 문제가 없습니다.

어떻게 pdt_conf 개체의 정보를 얻을 수 있습니까?

+0

당신이 간단한 예제를 빌드 할 수 있습니까? 우리는't_crt_list_prdt_conf_tab'이 무엇인지 모릅니다! 또한 귀하의 질문은 무엇입니까? 어떤 오류 메시지가 나타 납니까? –

+0

다른 함수에 의해 XML에서 파싱 된 정보를 선택하고 t_list_conf_tab로 저장해야합니다. 개체가있는 표를 선택하는 방법을 모르겠습니다. –

+0

왜 매개 변수의 유형이't_crt_list_prdt_conf_tab'입니까? 그것은 또 다른 대상인가? –

답변

2

문제가 무엇인지 확실하지 않습니다. 난 단지 t_pdt_config_rec에서 더 복잡한 개체 유형 t_list_conf_rec로 프로 시저 매개 변수의 유형을 변경하고 지금은 그 값을 액세스 할 수 없습니다 같아요 수 있습니다. PL/SQL에서 하위 개체에 액세스

SQL> CREATE OR REPLACE TYPE t_pdt_config_rec IS OBJECT(
    2 pdt_mnemo     VARCHAR2(30), 
    3 pdt_variant     VARCHAR2(30)) 
    4/

Type created 

SQL> CREATE OR REPLACE TYPE t_pdt_config_tab IS TABLE OF t_pdt_config_rec 
    2/

Type created 

SQL> CREATE OR REPLACE TYPE t_list_conf_rec IS OBJECT(
    2 pdt_conf t_pdt_config_rec, -- product configuration and info 
    3 pdt_childs t_pdt_config_tab) -- similar or same products cobinations 
    4/

Type created 

SQL> CREATE OR REPLACE TYPE t_list_conf_tab IS TABLE OF t_list_conf_rec 
    2/

Type created 

자바와는 달리되지 않습니다 : : 변경 전

SQL> SET SERVEROUTPUT ON 
SQL> DECLARE 
    2  l_conf_1  t_pdt_config_rec := t_pdt_config_rec('conf 1','A'); 
    3  l_conf_2  t_pdt_config_rec := t_pdt_config_rec('conf 2','B'); 
    4  l_child_1 t_pdt_config_rec := t_pdt_config_rec('conf 1 old', 'AA'); 
    5  l_child_2 t_pdt_config_rec := t_pdt_config_rec('conf 1 old old','AB'); 
    6  l_children_1 t_pdt_config_tab := t_pdt_config_tab(l_child_1, l_child_2); 
    7  l_children_2 t_pdt_config_tab := t_pdt_config_tab(); 
    8  l_obj_1  t_list_conf_rec := t_list_conf_rec(l_conf_1, l_children_1); 
    9  l_obj_2  t_list_conf_rec := t_list_conf_rec(l_conf_2, l_children_2); 
10  l_tab  t_list_conf_tab := t_list_conf_tab(l_obj_1, l_obj_2); 
11 BEGIN 
12  FOR cc IN (SELECT o.pdt_conf.pdt_mnemo pdt_mnemo, 
13      o.pdt_conf.pdt_variant pdt_variant 
14     FROM TABLE(l_tab) o 
15     WHERE o.pdt_conf.pdt_mnemo = 'conf 1' 
16     AND o.pdt_conf.pdt_variant = 'A') LOOP 
17  dbms_output.put_line('record found'); 
18  END LOOP; 
19 END; 
20/

record found 

PL/SQL procedure successfully completed 
+0

당신이 맞습니다. –

+0

내가 처음에 제안을 시도했지만 작동하지 않습니다. "pdt_conf"를 인식하지 못했습니다. –

+0

이것은 SQL * Plus 9ir2 –

1

만 t_pdt_config_tab이 있었고, 난 더 이 없습니다

의 비슷한 예를 구축하자 문제.

물론.

이제 NESTED 배열이 생겼습니다. 따라서 외부 TABLE(p_table)t_crt_list_prdt_conf_tab 행을 선택하게됩니다 (그게 무엇이든간에, t_list_conf_tab라고 입력 했습니까?).

대답은 t_list_conf_tab이고 t_crt_list_prdt_conf_tab이 아니라고 가정합니다. t_crt_list_prdt_conf_tabt_list_conf_tab을 포함하는 유형 인 경우에, 당신은 다른 수준이 필요합니다 :

select list_conf.id list_conf_id, 
     list_conf.pdt_conf.pdt_grp_mnemo, 
     list_conf.pdt_conf.pdt_mnemo, 
     list_conf.pdt_conf.pdt_name, 
     list_conf.pdt_conf.pdt_variant, 
     list_conf.pdt_conf.det_info_xsr_id , 
     list_conf.pdt_conf.det_info_view_template_name , 
     list_conf.pdt_conf.det_info_download_xsl_id, 
     list_conf.pdt_conf.det_info_ctrl_url, 
     list_conf.pdt_conf.det_info_ctrl_action, 
     list_conf.pdt_conf.create_ctrl_url, 
     list_conf.pdt_conf.create_ctrl_action, 
     list_conf.pdt_conf.change_contract_name_enabled, 
     list_conf.pdt_conf.period_selector, 
     list_conf.pdt_conf.period_selector_hide_all_opt, 
     pdt_child.pdt_grp_mnemo, 
     pdt_child.pdt_mnemo, 
     pdt_child.pdt_name, 
     pdt_child.pdt_variant, 
     pdt_child.det_info_xsr_id, 
     pdt_child.det_info_view_template_name, 
     pdt_child.det_info_download_xsl_id, 
     pdt_child.det_info_ctrl_url, 
     pdt_child.det_info_ctrl_action, 
     pdt_child.create_ctrl_url, 
     pdt_child.create_ctrl_action, 
     pdt_child.change_contract_name_enabled, 
     pdt_child.period_selector, 
     pdt_child.period_selector_hide_all_opt, 
     pdt_child.downloads 
    from (SELECT rownum id, 
       pdt_conf, 
       pdt_childs 
      FROM TABLE(p_table)) list_conf, 
     table(list_conf.pdt_childs) pdt_child; 

SQL 바이올린 예 : http://sqlfiddle.com/#!4/2eee6/1

+0

t_list_conf - 구성 목록입니다. –

+0

@DARK_A 해당 댓글의 의미가 확실하지 않습니다. 내 SQL은 당신이 원하는 방식으로 하위 배열에 액세스하는 방법을 보여주지 않았습니까? – DazzaL

+0

내가 t_list_conf로 무엇을 의미하는지 설명했다. t_crt_list_prdt_conf_tab 유형의 구조를 변경하고 절차의 복잡성을 줄임으로써이 문제를 해결했습니다. 답변 주셔서 감사합니다. –