2013-02-01 66 views
0

我有Oracle對象的問題。我正在寫一個函數。其中有選擇:表內對象內的Oracle對象

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,現在您無法訪問其中的值。

讓我們建立一個類似的例子:

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 

在PL/SQL訪問子對象是沒有什麼不同的java:

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_tab是包含t_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類型的結構和降低過程的複雜性來解決此問題。謝謝您的回答。 –