Oracle Object里面的对象里面

时间:2013-02-01 09:26:23

标签: sql oracle object plsql

我有oracle对象的问题。我正在写一个函数。哪个有SELECT:

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对象中的信息?

2 个答案:

答案 0 :(得分:2)

目前尚不清楚你的问题是什么。我只能猜测您已将过程参数的类型从t_pdt_config_rec更改为更复杂的对象类型t_list_conf_rec,现在您无法访问其中的值。< / p>

让我们建立一个类似的例子:

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

答案 1 :(得分: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 fiddle示例:http://sqlfiddle.com/#!4/2eee6/1