2013-02-01 69 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类型的结构和降低过程的复杂性来解决此问题。谢谢您的回答。 –